0

最近、Androidアプリを作成しています。 アラームマネージャーで保留中の意図を使用しました。 複数の保留中のインテントが必要なので、FLAG_ONE_SHOTを使用しています。 Alarm Managerは上記の間隔でブロードキャストを送信します。また、intentのsetAction()メソッドを使用して、currentTimeMillis()を引数として渡しています。私は対応する放送受信機を持っています。問題は、アプリが閉じられたり、Recentsトレイから削除されたりすると、ブロードキャスト受信者が実行されていないことです。保留中の意図とアラームマネージャー

  1. setAlarm:

    private void setupAlarm(int seconds) { 
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    Intent intent = new Intent(getBaseContext(), OnAlarmReceive.class); 
    //PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT); 
    intent.setAction(Long.toString(System.currentTimeMillis())); 
    intent.putExtra("id", ID); 
    
    PendingIntent pendingIntent = PendingIntent.getBroadcast(ChatActivity.this, 0, intent, PendingIntent.FLAG_ONE_SHOT); 
    
    Log.e(TAG, "Setup the Alarm"); 
    
    Calendar calendar = Calendar.getInstance(); 
    calendar.add(Calendar.SECOND, seconds); 
    
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);} 
    
  2. 放送受信

    public void onReceive(Context context, Intent intent) { 
    
    String id = intent.getStringExtra("id"); 
    Log.e(TAG,"On the verge of deleting the message with id: "+id); 
    SQLiteDatabase database = context.openOrCreateDatabase("/sdcard/userlists.db", SQLiteDatabase.CREATE_IF_NECESSARY, null); 
    database.execSQL("DELETE FROM " + "MESSAGE" + " WHERE " + "id" + "= '" + id + "'"); 
    
    broadcaster = LocalBroadcastManager.getInstance(context); 
    intent = new Intent(COPA_RESULT); 
    broadcaster.sendBroadcast(intent);} 
    
  3. たManifest.xml

    <receiver android:name=".OnAlarmReceive" android:enabled="true" android:exported="true"/> 
    
コードは以下のとおりであります

私を助けてください。アプリが閉鎖されていても、私は仕事をするためにBroadcasterが必要です。

+0

を完了するために従うことができますexampleです。! –

+0

サービスを利用することなく、ブロードキャストを受信できないのですか? もしそうなら、手順を提供できますか? –

答えて

0

それはアプリがメモリ

を取り戻すために、バックグラウンドで行くときあなたは、アプリケーションがアクティブであるか

か仕事を受ける ためJobServiceをスケジュールする必要がシステムがプロセスを殺す可能性のあるプロセスのライフサイクルバグです

公式からdocumentプロセスとアプリケーションのライフサイクル

プロセスライフサイクルバグの一般的な例は、BroadcastReceiver で、 BroadcastReceiver.onReceive()メソッドでインテントを受信した後にスレッドを開始してから、 関数から戻ってきます。それが戻ってくると、システムはBroadcastReceiver がアクティブではなくなったとみなし、そのホストプロセスはもう を必要としなくなりました(他のアプリケーションコンポーネントがアクティブでない限り)。したがって、システム は、いつでもメモリを再利用するためにプロセスを終了させることがあり、そうすることで、プロセス内で実行されている生成されたスレッドを終了させます。 この問題に対する の解決策は、通常、 BroadcastReceiverからJobServiceをスケジューリングするため、システムではアクティブな作業 が処理中であることがわかっています。ここで

あなたは `service`を使用するあなたの条件

+0

あなたは理解していますか? –

+0

はい...非常に非常に後悔して申し訳ありません...しかし、非常にありがとう! –

関連する問題