2011-12-24 28 views
7

Mam aplikację Prostą AutoStart z implementacją TimerTask, która działa dobrze na prawie wielu urządzeniach. Problem polega na tym, że nie działa on w Samsung Galaxy Y(2.3.6) i DELL XCD35(2.2). Po uruchomieniu urządzenia TimerTask działa przez kilka sekund, a następnie wyłącza się. Sprawdzam w Application->Manage Application, widziałem, że Applcation był już w stanie Force Stop. To oznacza, że ​​moja aplikacja zostanie zatrzymana po kilku sekundach. Jaki jest powód tego weird behaviour w tych dwóch urządzeniach, jeśli ktokolwiek ma rozwiązanie, może je udostępnić.Aplikacja AutoStart nie działa poprawnie

Poniżej znajduje się mój kod.

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 !!! jakikolwiek powód głosowania w dół? –

+3

Ważne, dobrze sformatowane pytanie, bez potrzeby głosowania w dół ... – WarrenFaith

Odpowiedz

0

myślę, że w niektórych AndroidOS czasami OS zabija wątki, które są uruchomione podczas gdy DevicesBoots która Android nie jest zaznajomiony z lub nie rozpoznaje go. Z tego powodu urządzenie TimerTask działa w niektórych urządzeniach, a w niektórych urządzeniach działa przez 5-10 sekund, a następnie aplikacja jest ForceStoppedautomatically przez system operacyjny Android pod numerem DeviceBoot (Uwaga - jego wymuszenie zatrzymania dotyczy zarządzania aplikacją, a nie Wymuś zamknięcie, więc nie otrzymuję żadnego błędu w Logcat).

Więc w tym przypadku rozwiązaniem jest użycie inbuiltMechanism który AndroidOS rozpoznaje i nie go zabić i utrzymuje ją w trybie jazdy. W tym przypadku udało mi się użyć AlarmManager do wykonania mojego zadania i to działa.

Może nie mam racji, ale moim ostatecznym rozwiązaniem było użycie AlarmManager, aby moja aplikacja działała w każdym urządzeniu.

@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

będzie Proponuję użyć AlarmManager zamiast TimerTask, jak w obliczu tego samego problemu ty opisane w wielu urządzeniach .

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

} 

dodać odbiornik Broadcast do swojej aplikacji, który powinien odsłuchiwać akcję ("ALARM_MANAGER_ACTION"). i dodaj tę akcję do pliku manifestu. Założę się, że będzie działać także na tych dwóch urządzeniach.

Powiązane problemy