2011-12-24 16 views
7

Ho una semplice applicazione AutoStart con implementazione TimerTask, che funziona correttamente in quasi tutti i dispositivi. Il problema è che non funziona in Samsung Galaxy Y(2.3.6) e DELL XCD35(2.2). Quando il dispositivo si avvia TimerTask funziona per alcuni secondi e quindi si arresta. Ho controllato il Application->Manage Application, ho visto che l'Applcation era già nello stato Force Stop. Ciò significa che la mia applicazione si ferma dopo alcuni secondi. Quindi, qual è la ragione di questo weird behaviour in questi due dispositivi, se qualcuno ha la soluzione lo condividono.AutoStart Applicazione non funzionante correttamente

Di seguito è riportato il mio codice.

MyReceiver.java

public class MyReceiver extends BroadcastReceiver{ 

    private Timer mTimer = new Timer(); 
    @Override 
    public void onReceive(Context context, Intent arg1) { 
     Toast.makeText(context, "Device Booted", Toast.LENGTH_LONG).show(); 
     Log.d("TAG","Device Booted"); 
     mTimer.scheduleAtFixedRate(new MyTimerTask(), 2000,2000); 
    } 

    private class MyTimerTask extends TimerTask 
    { 
     @Override 
     public void run() { 
      Log.d("TAG","TimerTask executed...."); 
     } 
    } 
} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.autostart.app" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="8" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <receiver android:name=".MyReceiver"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED"/> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 
+0

Ah !!! qualche motivo sul voto negativo? –

+3

Una domanda valida, ben formattata, non è necessario un voto negativo ... – WarrenFaith

risposta

0

penso che in alcuni dei AndroidOS a volte il sistema operativo uccide i thread in esecuzione mentre il DevicesBoots che Android non ha familiarità con o non lo riconosce. Questo è il motivo per cui il TimerTask funziona in alcuni dispositivi e in alcuni dispositivi funziona solo per 5-10 secondi e quindi l'applicazione è ForceStoppedautomatically dal sistema operativo Android su DeviceBoot (Nota: la sua interruzione forzata da Gestisci applicazione e non Chiusura forzata in modo da non rilevare alcun errore nel Logcat).

Quindi, in questo caso la soluzione è quella di utilizzare il inbuiltMechanism che AndroidOS riconosce e non ucciderlo e lo mantiene in una modalità di funzionamento. In questo caso sono riuscito a utilizzare AlarmManager per eseguire la mia attività e funziona.

Potrei non avere ragione, ma la mia soluzione finale era quella di utilizzare AlarmManager per far funzionare la mia applicazione su ogni dispositivo.

@Override 
    public void onReceive(Context context, Intent arg1) { 

     Intent myIntent = new Intent(context, AlarmService.class); 
     PendingIntent pendingIntent = PendingIntent. 
             getService(context, 0, myIntent, 0); 
     AlarmManager alarmManager = (AlarmManager) context 
            .getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
         System.currentTimeMillis() + 2000, 2000, pendingIntent); 
    } 

UPDATE:

AlaramManager is critical system service that runs all the time.

2

io suggerisco di utilizzare AlarmManager invece di TimerTask, come ho affrontato lo stesso problema che hai descritto in molti dispositivi .

public void onReceive(Context context, Intent arg1) { 
    Toast.makeText(context, "Device Booted", Toast.LENGTH_LONG).show(); 
    Log.d("TAG","Device Booted"); 
AlarmManager AM =(AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(); 
    intent.setAction("ALARM_MANAGER_ACTION");//can add any string action here 
    PendingIntent pi = PendingIntent.getBroadcast(mContext 
             .getApplicationContext(), 0, intent,0); 
AM.set(AlarmManager.RTC,selectedTime, pi); 
AM.setRepeating(AM.RTC_WAKEUP, System.currentTimeMillis()+2000, 2000, pi); 
    } 


    public class MyReceiver1 extends BroadcastReceiver{ 
    //event will come here 
    private Timer mTimer = new Timer(); 
    @Override 
    public void onReceive(Context context, Intent arg1) { 
// check if event is same as you broadcasted through alarmManager 
    Toast.makeText(context, "Device Booted", Toast.LENGTH_LONG).show(); 
    Log.d("TAG","TimerTask executed...."); 

} 

aggiungere un ricevitore broadcast nella vostra applicazione, che dovrebbe ascoltare ("ALARM_MANAGER_ACTION") azione. e aggiungi questa azione nel file manifest. Scommetto che funzionerà anche in questi due dispositivi.

Problemi correlati