2017-11-28 27 views
0

したがって、画面がオンかオフかをチェックするサービスがあります(hereから)。 これが主な活動です:アプリケーションが終了した場合、サービスは実行されません

public class MainActivity extends Activity { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     onCreate(); 
    } 
    public void onCreate() { 

     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     BroadcastReceiver mReceiver = new ScreenReceiver(); 
     registerReceiver(mReceiver, filter); 
    } 

    @Override 
    protected void onPause() { 
     if (ScreenReceiver.screenOff) { 

      System.out.println("SCREEN TURNED OFF"); 
     } else { 

      System.out.println("this is when onPause() is called when the screen state has not changed "); 

     } 
     super.onPause(); 
    } 
    @Override 
    protected void onResume() { 
     // only when screen turns on 
     if (!ScreenReceiver.screenOff) { 
      System.out.println("SCREEN TURNED ON"); 
     } else { 

      System.out.println(" this is when onResume() is called when the screen state has not changed "); 
     } 
     super.onResume(); 
    } 
} 

サービスクラス:

public class UpdateService extends Service { 

    public void onCreate() { 
     super.onCreate(); 
     // register receiver that handles screen on and screen off logic 

     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     BroadcastReceiver mReceiver = new ScreenReceiver(); 
     registerReceiver(mReceiver, filter); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     boolean screenOn = intent.getBooleanExtra("screen_state", false); 
     if (!screenOn) { 
      System.out.println("Screen is off"); 
     } else { 
      System.out.println("Screen is on"); 
     } 
    } 

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

受信機:アプリがバックグラウンドに送信されたとき

public class ScreenReceiver extends BroadcastReceiver { 

    public static boolean screenOff; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     System.out.println("onReceive "); 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      screenOff = true; 
      System.out.println("SCREEN TURNED OFF on BroadcastReceiver"); 
      Log.d("Check", "SCREEN TURNED OFF"); 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      screenOff = false; 
      System.out.println("SCREEN TURNED ON on BroadcastReceiver"); 
      Log.d("Check", "SCREEN TURNED ON"); 

     } 
     Intent i = new Intent(context, UpdateService.class); 
     i.putExtra("screen_state", screenOff); 
     context.startService(i); 
    } 
} 

上記のサービスが完全に実行されます。しかし、タスクマネージャを使用してアプリが強制終了されると、サービスはもう機能しません。私は、アプリが殺されたときでさえ、サービスが必要です。

これを有効にするにはどうすればよいですか?何か案は?

答えて

2

理由は、サービスがアプリケーションと同じプロセスで実行されているためです。マニフェストファイルにandroid:process=":yourServiceName"と設定すると、サービスが新しいプロセスを開始し、サービスが表示されます。あなたのサービスが実際にあなたがサービスのごonTaskRemovedメソッド内AlarmManagerを使用することができるサービスを再起動するには、この方法

private boolean isMyServiceRunning(Class<?> serviceClass) { 
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if (serviceClass.getName().equals(service.service.getClassName())) { 
      return true; 
     } 
    } 
    return false; 
} 

を使用して実行されている場合

また、チェックします。

@Override 
    public void onTaskRemoved(Intent rootIntent) { 

     Intent restartService = new Intent(getApplicationContext(), this.getClass()); 
     PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartService, PendingIntent.FLAG_ONE_SHOT); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.set(AlarmManager.ELAPSED_REALTIME, 5000, pendingIntent); 


    } 
+0

しかし、私はアプリを殺すように、サービスはまだ実行されていません。アプリを強制終了すると、デバイスが切断されています。これをどうすればテストできますか? – Thomas

+0

私は自分の答えを編集しました。アプリが強制終了されたときにonTaskRemovedメソッドを使用してサービスを再開します。 –

+0

私のアプリをrecents .i.eから削除すると、サービスはまだ死んでしまいます。あなたが私のアプリを殺すと – Thomas

1

同じプロセスで実行されている場合は、サービスがデスクトップアプリケーションと共に終了することは明らかです。

Windowsサービス/ Linuxデーモンとしてサービスを実行すると、ユーザーによって作成されたプロセスと比較してライフサイクルが異なります。たとえば、ログアウトするとアプリケーションは自動的に終了します。

+0

私は上記のコードでこれをどのように実装できますか? – Thomas

+0

あなたはどのプラットフォームを使用していますか?コード内のすべてのインポートが終了したようです。私の野生の推測では、あなたはAndroidを使用しています。 –

+0

私はアンドロイドスタジオを使用しています。 – Thomas

関連する問題