2011-12-24 6 views
7

私は、ほとんどのデバイスでうまく動作するTimerTaskで簡単なAutoStartアプリケーションを実装しています。問題は、Samsung Galaxy Y(2.3.6)DELL XCD35(2.2)で機能していないことです。デバイスが起動すると、TimerTaskが数秒間動作してからシャットダウンします。私はApplication->Manage Applicationをチェックし、ApplcationがすでにForce Stop州にあることがわかりました。つまり、アプリケーションが数秒後にどのように停止するかを意味します。この2つのデバイスでこのweird behaviourの理由は何ですか、もし誰かが解決策を共有していれば、それを共有します。AutoStartアプリケーションが正常に動作しない

以下は私のコードです。

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

ああ!!!投票の理由は何ですか? –

+3

有効な形式の質問です。投票の必要はありません... – WarrenFaith

答えて

0

私は時々、OSはAndroidが精通していないか、それを認識しませんがDevicesBoots実行中のスレッドを殺すAndroidOSの一部ではと思います。これは、TimerTaskが一部のデバイスで動作し、一部のデバイスではわずか5-10秒間動作し、アプリケーションがDeviceBoot)のAndroid OSによってForceStoppedautomaticallyである理由です。強制終了するので、Logcatのエラーは発生しません)。

だからその場合には解決策を使用することです Android OSを認識し、それを殺さないと走行モードでそれを保持します inbuilt Mechanism。この場合、私は AlarmManagerを使用して自分のタスクを実行していました。

私は正しくないかもしれませんが、私の最終的な解決策は、すべてのデバイスでアプリケーションを動作させるためにAlarmManagerを使用することでした。

@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
私はあなたが多くのデバイスで説明したのと同じ問題に直面したとして、あなたは、代わりにTimerTaskをのAlarmManagerを使用することをお勧めします

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

} 

("ALARM_MANAGER_ACTION")アクションを聞くべきである、あなたのアプリに放送受信機を追加します。このアクションをマニフェストファイルに追加します。 私はこれらの2つのデバイスでも動作すると確信しています。

関連する問題