2017-01-29 1 views
1

Ich habe App für die Erkennung von otg Kabel erstellt.Wenn ich starte es zeigt "otg nicht verbunden" und es wiederholt es viele Male und wenn ich in otg Kabel anschließen es immer noch wiederholt "otg nicht verbunden" und nach einigen Mal zeigt es "otg connected" !!!!Android Alarm Manager wiederholen

Wenn ich app starte, sollte es nichts zeigen, es sollte nur zeigen, wenn ich anschliesse oder wenn ich otg Kabel ausstoße. Und es sollte dieselbe Mitteilung viele Male nicht wiederholen !!!!

MainActivity.class

public class MainActivity extends AppCompatActivity 
{ 
    private Process suProcess; 
    private PendingIntent pendingIntent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     getRoot(); 
     startAlarm(); 
    } 

    private void getRoot() 
    { 
     try 
     { 
      suProcess = Runtime.getRuntime().exec("su"); 
     } 
     catch (IOException e) 
     { 

     } 
    } 

    private void startAlarm() 
    { 
     Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0); 

     AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     int interval = 1000; 
     manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent); 
    } 
} 

AlarmReceiver.class

public class AlarmReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context,Intent intent) 
    { 
     File directory = new File("/sys/bus/usb/devices"); 
     File[] contents = directory.listFiles(); 

     if(contents.length == 0) 
     { 
      Toast.makeText(context,"otg not connected",Toast.LENGTH_SHORT).show(); 
     } 
     else 
     { 
      Toast.makeText(context,"otg connected",Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

Antwort

0

, wenn Sie den Alarm nicht wollen, auf AppStart, tun Sie es nicht in der onCreate Methode setzen. Ich würde diese Methode in ein Runnable setzen, das regulär startalarm aufrufen würde. In der AlarmReceiver Klasse würde ein statisches int

private static int conn_length = 0; 

und in der OnReceive Methode hinzufügen, wenn würde den folgenden Code ein:

File directory = new File("/sys/bus/usb/devices"); 
File[] contents = directory.listFiles(); 

if(contents.length == conn_length){ 
    return; 
} 
else{ 
    conn_length = contents.length; 
} 

if(conn_length == 0) 
{ 
    Toast.makeText(context,"otg not connected",Toast.LENGTH_SHORT).show(); 
} 
else 
{ 
    Toast.makeText(context,"otg connected",Toast.LENGTH_SHORT).show(); 
} 

Auf diese Weise Sie nur eine Meldung erhalten, wenn der Verbindungsstatus ändert.

Edit:

Beispiel eines Runnable implentation.

im onCreate Methode fügen Sie diese

Handler handler = new Handler(); 
handler.post(alarmUpdater); 

und in einem anderen Teil der Klasse:

public Runnable alarmUpdater= new Runnable() { 
    @Override 
    public void run() { 
     startalarm(); 
    } 
}; 
+0

Was Runnable ist? – pavlenis

+0

Wie man Methode innerhalb Runnable setzt? – pavlenis

+1

Es funktioniert !!! Vielen Dank!!! Kannst du mir einfach sagen, wie man Switch statt Toast in AlarmReceiver.class aktiviert und deaktiviert !!! – pavlenis

Verwandte Themen