android - 当应用程序被 android 中最近的应用程序杀死时的回调监听器

标签 android service android-service background-service

让我直说我的问题。

有个类似的老问题: Continue Service even if application is cleared from Recent app .请通过link在继续之前。

在应用程序完全销毁之前,我必须将一些数据保存到本地数据库。

我对服务的 onTaskRemoved() 方法有以下问题:

  1. onTaskRemoved() 方法不会在每次从最近的应用程序屏幕停止应用程序(以及服务)时触发。
  2. 即使每次都调用 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;
    }
}

关于android - 当应用程序被 android 中最近的应用程序杀死时的回调监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46001740/

相关文章:

android - android-gradle无法创建 'AppPlugin'类型的插件

android - Android互动式教学

java - 由于 java.Lang.RuntimeException,应用程序不断关闭

java - Android 前台服务通知未显示在状态栏中

android - 如何在服务中使用 Universal-Image-Loader?

android - 如何在 chmod +x 不起作用的 android 操作系统上运行可执行二进制文件?

java - 如何将请求从一个应用程序发送到另一个应用程序?

windows - 无法使用 WiX 启动 Windows 服务

android - Activity 未找到异常 : Unable to find explicit activity class service

android - 单击通知未启动由服务创建的我的 PendingIntent