タスク マネージャーによって強制終了された場合、アプリケーション スレッドは終了します。他のアプリケーションまたはタスク マネージャーによって強制終了されたかのように、アプリケーションを再起動する必要があります。何か案が?
5 に答える
START_STICKY コマンドでバックグラウンド サービスを実行する必要があります。Service を拡張し、次のように onCommand をオーバーライドするだけです。
@Override
public int onStartCommand(Intent intent,int flags,int startId) {
super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
このように、サービスが閉じると(システムまたはその他によって)サービスが再起動されます
アプリケーションが実行されているかどうかをサービス (たとえば onCreate) で確認し、実行されていない場合はもう一度起動します。PackageManager を使用すると、これをチェックするか、単に静的ブール値 is_alive を配置して、アクティビティが常に実行されているかどうかを確認できると思います。
よろしくジム
Android 2.3 での START_STICKY のバグ
私は全力でサービスを維持する必要がありました。サービスがいつでも実行されている場合は、UI をポップできます。
onDestroy()
再起動します。
デバイス管理者がいるため、アプリをアンインストールできません。
これは一種のペアレンタル コントロールであり、ユーザーはそれがあることを知っています。停止する唯一の方法は、デバイス管理者を削除してアンインストールすることですが、デバイス管理者を削除すると、Kaspersky と同じように電話がロックされます。
起動完了、ユーザー プレゼンス、画面オン、画面オフなど、多くのブロードキャスト レシーバーがあり、その他多数のサービスを開始します。UI でも実行できます。または、サービスで、アクティビティが有効かどうか、表示されているかどうかを確認してください。表示されていない場合は、ポップしてください。
情報を正当な理由で使用することを願っています!
編集:サービスコードスニペットを再起動します:
// restart service:
Context context = getApplicationContext();
Intent myService = new Intent(context, MyService.class);
context.startService(myService);
Edit2: spippet を追加して、サービスが実行されているかどうかを確認します...ブロードキャストの負荷
public static boolean isMyServiceRunning(Context context) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (MyService.class.getName().equals(service.service.getClassName())) {
Log.d("myTag", "true");
return true;
}
}
Log.d("myTag", "false");
return false;
}
Edit3 他のサービスの開始:
public static void startTheService(Context context) {
Intent myService = new Intent(context, MyService.class);
context.startService(myService);
}
Android 2.3 のバグを忘れないでください: 初期化のロジックを
@Override
public void onCreate()
ではなく:
@Override
public int onStartCommand(Intent intent, int flags, int startId)
Google IO公式製品のソースコードを見ていると、次のことがわかりました
((AlarmManager) context.getSystemService(ALARM_SERVICE))
.set(
AlarmManager.RTC,
System.currentTimeMillis() + jitterMillis,
PendingIntent.getBroadcast(
context,
0,
new Intent(context, TriggerSyncReceiver.class),
PendingIntent.FLAG_CANCEL_CURRENT));
スティッキー サービスを開始し、アラーム マネージャを登録して、アプリケーションが生きているかどうかを何度も確認してから実行することができます。
また、受信機を作成して登録し、受信<action android:name="android.intent.action.BOOT_COMPLETED" />
機からサービスを開始することもできます。OSまたは一部のサービス/アプリケーションを強制終了するときに、ブロードキャストメッセージが必要だと思います。
大まかなアイデアを提供するために、私はこれを行い、その作業を行いました 1)レシーバーレシーバーコードを登録します。
@Override public void onReceive(コンテキスト コンテキスト、インテント インテント) {
try {
this.mContext = context;
startService(intent.getAction());
uploadOnWifiConnected(intent);
} catch (Exception ex) {
Logger.logException(ex);
Console.showToastDelegate(mContext, R.string.msg_service_starup_failure, Toast.LENGTH_LONG);
}
}
private void startService(final String action) {
if (action.equalsIgnoreCase(ACTION_BOOT)) {
Util.startServiceSpawnProcessSingelton(mContext, mConnection);
} else if (action.equalsIgnoreCase(ACTION_SHUTDOWN)) {
}
}
サービスコード:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Logger.logInfo("Service Started onStartCommand");
return Service.START_STICKY;
}
サービスを開始するたびに呼び出されるため、onStartCommand で何もしないことを好みますが、onCreate はサービスが開始されたときに初めて呼び出されるため、onCreate でほとんどのコードを実行します。実行中かどうか。
Googleの@RetoMeyerによると、解決策はアプリを「スティッキー」にすることです。
このためには、インテントサービス管理でSTART_STICKYを確立する必要があります。
開発者のAndroidからのこの参照を確認してください
はい、メモリ不足の問題が発生すると、必要なメモリを補うために Android OS がアプリケーションを強制終了し始めます。これを実現できるサービスを使用すると、サービスはアプリケーションと並行して実行されますが、場合によっては、サービスも同時に強制終了されることがあります。メモリが十分である場合は強制終了した後、すべての場合ではなく、Android OS自体がアプリケーションを再起動しようとします。最後に、OS と内部動作に依存するすべてのケースで、OS によって強制終了されたアプリケーションを再起動するための厳密で迅速なルールはありません。