android 中最近的应用程序终止应用程序时的回调侦听器
Callback listener when application is killed from recent applications in android
让我直说我的问题。
有个类似的老问题:
Continue Service even if application is cleared from Recent app. Please go through the link 在继续之前。
我必须在应用程序完全销毁之前将一些数据保存到本地数据库。
我对服务的 onTaskRemoved() 方法有以下问题:
- 每次从最近的应用程序屏幕停止应用程序(以及服务)时,不会触发 onTaskRemoved() 方法。
- 即使每次都调用onTaskRemoved(),方法也没有执行完全。我的意思是,如果方法中有 20 条语句,则只会执行 5 或 10 条语句,然后该方法会中断。就像我有 20 个 System.out.println() 语句,而不是只有 5 或 10 或 12(任意随机数)语句打印和之后的方法中断。
所以我可以依赖onTaskRemoved()方法来清理应用获取的资源
这是我的应用程序发布的一个阻塞问题。我已经尝试了所有 技巧 。就像在堆栈中至少有一个 activity(我称它为 GhostActivity),这样如果应用程序从最近的应用程序屏幕中被杀死,我们可以在 onDestroyed() 方法中清理 activity。 onDestroyed() 被调用,但它有与 onTaskRemoved() 方法完全相同的问题。
几周以来我一直被这个问题困扰着,这很烦人。如果有人有任何解决方案,请告诉我。
我终于成功了。我结合使用了服务和警报管理器。每次我想处理强制关闭场景时,我都会启动一个服务,其中我 运行 一个无限循环。此循环将每 15 秒迭代一次。在循环中,我将闹钟设置为距当前时间 20 秒。现在,如果循环的下一次迭代发生,警报将更新并重置为新的当前时间后 20 秒。这样,只有服务没有被用户调用stopService()方法销毁时才会触发告警。
public class MyIntentService extends IntentService {
public MyIntentService() {
super("My IntentService");
}
private boolean stopped = false;
private Thread runningThread;
private static MyIntentService mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = MyIntentService.this;
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
protected void onHandleIntent(Intent intent) {
stopped = false;
runningThread = Thread.currentThread();
while(!this.stopped) {
Intent intent = new Intent("Your_Custom_Broadcast_Action");
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent broadcastIntent = PendingIntent.getBroadcast(WifiService.this, CLEAN_UP_ALARM_REQUEST_CODE,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 20000, broadcastIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 20000, broadcastIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 20000, broadcastIntent);
}
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
mInstance = null;
if (runningThread != null) {
runningThread.interrupt();
}
}
public void stopService() {
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent broadcastIntent = PendingIntent.getBroadcast(WifiService.this, CLEAN_UP_ALARM_REQUEST_CODE,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(broadcastIntent);
stopped = true;
if (runningThread != null)
runningThread.interrupt();
}
public static MyIntentService getActiveInstance() {
return mInstance;
}
}
让我直说我的问题。
有个类似的老问题: Continue Service even if application is cleared from Recent app. Please go through the link 在继续之前。
我必须在应用程序完全销毁之前将一些数据保存到本地数据库。
我对服务的 onTaskRemoved() 方法有以下问题:
- 每次从最近的应用程序屏幕停止应用程序(以及服务)时,不会触发 onTaskRemoved() 方法。
- 即使每次都调用onTaskRemoved(),方法也没有执行完全。我的意思是,如果方法中有 20 条语句,则只会执行 5 或 10 条语句,然后该方法会中断。就像我有 20 个 System.out.println() 语句,而不是只有 5 或 10 或 12(任意随机数)语句打印和之后的方法中断。
所以我可以依赖onTaskRemoved()方法来清理应用获取的资源
这是我的应用程序发布的一个阻塞问题。我已经尝试了所有 技巧 。就像在堆栈中至少有一个 activity(我称它为 GhostActivity),这样如果应用程序从最近的应用程序屏幕中被杀死,我们可以在 onDestroyed() 方法中清理 activity。 onDestroyed() 被调用,但它有与 onTaskRemoved() 方法完全相同的问题。
几周以来我一直被这个问题困扰着,这很烦人。如果有人有任何解决方案,请告诉我。
我终于成功了。我结合使用了服务和警报管理器。每次我想处理强制关闭场景时,我都会启动一个服务,其中我 运行 一个无限循环。此循环将每 15 秒迭代一次。在循环中,我将闹钟设置为距当前时间 20 秒。现在,如果循环的下一次迭代发生,警报将更新并重置为新的当前时间后 20 秒。这样,只有服务没有被用户调用stopService()方法销毁时才会触发告警。
public class MyIntentService extends IntentService {
public MyIntentService() {
super("My IntentService");
}
private boolean stopped = false;
private Thread runningThread;
private static MyIntentService mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = MyIntentService.this;
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
protected void onHandleIntent(Intent intent) {
stopped = false;
runningThread = Thread.currentThread();
while(!this.stopped) {
Intent intent = new Intent("Your_Custom_Broadcast_Action");
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent broadcastIntent = PendingIntent.getBroadcast(WifiService.this, CLEAN_UP_ALARM_REQUEST_CODE,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 20000, broadcastIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 20000, broadcastIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 20000, broadcastIntent);
}
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
mInstance = null;
if (runningThread != null) {
runningThread.interrupt();
}
}
public void stopService() {
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent broadcastIntent = PendingIntent.getBroadcast(WifiService.this, CLEAN_UP_ALARM_REQUEST_CODE,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(broadcastIntent);
stopped = true;
if (runningThread != null)
runningThread.interrupt();
}
public static MyIntentService getActiveInstance() {
return mInstance;
}
}