1

これについて多くの質問があります。 私はそれらの大部分を試して、それに多くの時間を費やしました。 しかし、すべてのソリューション実際アプリが閉じられた後、または最近のアプリからスワイプされた後にアラームマネージャー/サービス/ブロードキャストレシーバーが機能していない

を得ていないが、私は、バックグラウンド・プロセスでもアプリが、私は繰り返し

はそう最初に私が持っていた15分後に、ユーザのGPS位置を取りたい、最近のアプリ から削除された無限時間に実行したいです私は5秒の定期的な間隔でLocationServiceRestarterを呼び出します警報リピータを開始していますその放送受信機の 名前はLocationServiceRestarter である私のサービスを呼び出す放送受信機を作成している

TRY 1 ****** と次のように試してみました

Intent intent = new Intent("com.lmf.overduereport.gpstimer.LocationServiceRestarter"); 
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
     0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
AlarmManager am = 
     (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
alarm_manager.setRepeating(AlarmManager.RTC_WAKEUP,SystemClock.elapsedRealtime()+5*1000,5*1000,pendingIntent); 

私は最近のアプリを私は放送受信機と呼ばれるかどうについての私のフォルダにログを書き込み放送受信機内部のログを追加した からアプリを削除しない場合、それは正常に動作します。 この場合、ブロードキャスト受信機自体はアラームマネージャーから呼び出されていませんが、明らかに私が場所を記録するために呼びたいサービスを呼び出すことはありません。

TRY 2 ****** 無限に実行できるサービスを試しました。それはまた、アプリが

TRY 3 ****** を閉じた後、この時間は私が上記

Intent intent = new Intent("com.lmf.overduereport.gpstimer.LocationServiceRestarter"); 
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
     0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
AlarmManager am = 
     (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
//-- 
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
     SystemClock.elapsedRealtime() + 5000, pendingIntent); 

放送受信機を呼び出し、中になりますが、以下のなかった代わりに、そのことを繰り返しアラームマネージャを呼び出すことはありません動作しなくなりましたチェーンが続行されますので、新しいスケジュール時刻と放送受信を再開します上記

LocationServiceM.appendLog("Got Reciever******"); 
intent = new Intent("com.lmf.overduereport.gpstimer.LocationServiceRestarter"); 
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
     12345, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
AlarmManager am = 
     (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE); 

am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
     SystemClock.elapsedRealtime() + 5000, pendingIntent); 

を次のように放送受信機は、私はアラームマネージャを追加しました。

しかし、悲しいことにもうまくいきません。最近のアプリからアプリが削除されないと正常に動作します。

でも私は運と運命のないサービスと同じことを試みました。

結論:最近のアプリからアプリを削除してもアラームマネージャーやブロードキャスト受信機は呼び出されません。

しかし、最近のアプリからもアプリが閉鎖されていても、バックグラウンドで実行される多くのアプリが見られました。

+0

このリンクを参照してください。 –

+0

Samsung galaxy j5 Prime。アンドロイドバージョン6.0.1とパナソニックP81アンドロイドバージョン4.2.2 .. –

答えて

0

OSは、十分なメモリがある場合にOSを再作成し、ヌルインテントでもう一度onStartCommand()を呼び出すように指示するSTART_STICKYを使用できます。 START_NOT_STICKYは、OSにサービスの再作成を邪魔しないように指示します。

あなたはアプリを閉じたときに発射へのサービスを使用するか、タスクから殺すことができます。

public class SensorService extends Service { 
public int counter=0; 
public SensorService(Context applicationContext) { 
    super(); 
    Log.i("HERE", "here I am!"); 
} 

public SensorService() { 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, flags, startId); 
    startTimer(); 
    return START_STICKY; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.i("EXIT", "ondestroy!"); 
    Intent broadcastIntent = new Intent("uk.ac.shef.oak.ActivityRecognition.RestartSensor"); 
    sendBroadcast(broadcastIntent); 
    stoptimertask(); 
} 

private Timer timer; 
private TimerTask timerTask; 
long oldTime=0; 
public void startTimer() { 
    //set a new Timer 
    timer = new Timer(); 

    //initialize the TimerTask's job 
    initializeTimerTask(); 

    //schedule the timer, to wake up every 1 second 
    timer.schedule(timerTask, 1000, 1000); // 
} 

/** 
* it sets the timer to print the counter every x seconds 
*/ 
public void initializeTimerTask() { 
    timerTask = new TimerTask() { 
     public void run() { 
      Log.i("in timer", "in timer ++++ "+ (counter++)); 
     } 
    }; 
} 

/** 
* not needed 
*/ 
public void stoptimertask() { 
    //stop the timer, if it's not already null 
    if (timer != null) { 
     timer.cancel(); 
     timer = null; 
    } 
} 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

あなたも誰かや何かがサービスを殺すときに信号を受信するBroadcastReceiverを必要とします。その役割はサービスを再開することです。完全な実装については

public class SensorRestarterBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops! Oooooooooooooppppssssss!!!!"); 

     context.startService(new Intent(context, SensorService.class));; 
    } 
} 

は、あなたがテストしているどのようなデバイスおよび/またはAndroidのバージョン http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android

+0

実際に私も前にそれを試みた。ほとんどの非AOSPベースの電話機ではstart_stckyが動作しません。 start stickyはサービスを再作成しません。最近のアプリからアプリを削除すると終了します。また、最近のアプリから削除した後に破棄されてくることはありません。だから私はまたそれから放送受信機を呼び出すことはできません –

関連する問題