2011-12-24 25 views
7

Tengo una aplicación simple AutoStart con la implementación TimerTask, que funciona bien en casi todos los dispositivos. El problema es que no está funcionando en Samsung Galaxy Y(2.3.6) y DELL XCD35(2.2). Cuando el dispositivo arranca TimerTask, funciona durante algunos segundos y luego se apaga. Reviso en el Application->Manage Application, vi que la aplicación ya estaba en el estado Force Stop. Eso significa algo de cómo mi aplicación se detiene después de algunos segundos. Entonces, ¿cuál es el motivo de este weird behaviour en estos dos dispositivos? Si alguien tiene la solución, compártelo.La aplicación AutoStart no funciona correctamente

A continuación se muestra mi código.

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 !!! ¿Alguna razón sobre el voto negativo? –

+3

Una pregunta válida, de buen formato, sin necesidad de un voto negativo ... – WarrenFaith

Respuesta

0

Creo que en algunos de los AndroidOS veces el sistema operativo mata a los subprocesos que se ejecutan mientras el DevicesBoots el que Android no está familiarizado con o no lo reconoce. Esta es la razón por la cual el TimerTask está funcionando en algunos dispositivos y en algunos dispositivos solo funciona durante 5-10 segundos y luego la aplicación es ForceStoppedautomatically por el sistema operativo Android en DeviceBoot (Nota: su fuerza detiene desde la aplicación de administración y no Fuerza cerca, así que no me sale ningún error en el Logcat).

Así que en ese caso la solución es utilizar el inbuiltMechanism cuales AndroidOS reconoce y no la mata y lo mantiene en un modo de funcionamiento. En este caso, logré usar AlarmManager para realizar mi tarea y funciona.

Puede que no tenga razón, pero mi solución final fue utilizar AlarmManager para que mi aplicación funcione en todos los dispositivos.

@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); 
    } 

ACTUALIZACIÓN:

AlaramManager is critical system service that runs all the time.

2

voy a sugerir que use AlarmManager en lugar de TimerTask, ya que se enfrentó al mismo problema que se describe en muchos dispositivos .

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...."); 

} 

añadir un receptor de radiodifusión en su aplicación, lo que debería escuchar ("ALARM_MANAGER_ACTION") acción. y agrega esta acción en el archivo de manifiesto. Apuesto a que también funcionará en estos dos dispositivos.

Cuestiones relacionadas