【问题标题】:What exactly happens when you remove a task from recents?当您从最近的任务中删除任务时,究竟会发生什么?
【发布时间】:2016-09-12 10:46:46
【问题描述】:

在通过滑动从应用切换器中删除应用时,我注意到一个令人惊讶的行为。该应用程序有一项服务。当应用程序被“杀死”时,从服务启动的任何线程继续运行,其他线程被终止。

真正令人惊讶的是,系统可以确定哪些线程是从服务启动的,即使我尝试像这样混淆线程的来源:

  • 在服务的 onCreate() 方法中,将一个 runnable 发布到主线程处理程序。
  • runnable 启动一个新线程,该线程在从最近删除后仍然存在。

如果我将完全相同的可运行文件发布到完全相同的处理程序但来自活动,则线程将无法生存。系统怎么可能知道?它是否以某种方式跟踪发布的可运行文件是从哪个线程发布的?

编辑:根据要求,onCreate() 方法:

@Override
public void onCreate() {
    super.onCreate();

    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        @Override
        public void run() {
            new Thread(){
                @Override
                public void run() {
                    while (true) {
                        System.out.println("hello from thread");
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }
                    }
                }
            }.start();
        }
    }, 1000);
}

【问题讨论】:

  • 其实Service在android中运行在UI Thread上(除非你使用IntentService
  • 并且 Android 处理程序包含 ThreadLocal 以检查 UI 线程。
  • 如果可能,请发布您的 onCreate() 代码。
  • @PravinDivraniya 完成
  • @MoshErsan 就是这样,线程总是从 UI 线程启动,但系统似乎知道它源自服务。

标签: android


【解决方案1】:

终于知道发生了什么。系统不会选择性地杀死非服务线程,它会杀死整个应用程序,然后再次启动服务,因此看起来服务的线程没有受到影响。

【讨论】:

  • 所以如果你有正在运行的进程(例如复制文件)你会丢失那个文件吗?
  • @MoshErsan 我认为该文件会继续存在,但只是不完整。
  • 这就是我的意思,所以从最近清除应用程序会破坏你的进程
  • 是的,它会杀死进程。
【解决方案2】:

只是想对此有所了解。

Android 组件不会注意到不是它们创建的线程。因此,虽然 IntentService 将处理它为使用 onHandleIntent() 而创建的线程,但常规 Service 不会关注您自己派生的任何线程。

一旦服务被销毁,它泄漏的任何线程都将继续运行,直到 Android 终止该进程。

如果您的线程意外停止,这与 Service 无关——同样,Service 对您自己 fork 的线程一无所知。

【讨论】:

  • 我当然知道这一点,这就是行为如此令人困惑的原因。
【解决方案3】:

参考文献,

它退出应用程序的方式与一遍又一遍地按下返回的方式相同。有时,这也会杀死它的后台进程,但有时它不会:

删除最近任务中的条目将终止该进程存在的所有后台进程。它不会直接导致服务停止,但是有一个 API 可以让他们找出任务已被删除,以决定他们是否希望这意味着他们应该停止。这样一来,删除电子邮件应用程序的最近任务不会导致它停止检查电子邮件。

如果你真的想完全停止一个应用,你可以长按最近的任务去应用信息,然后在那里点击强制停止。强制停止是完全终止应用程序——所有进程被终止,所有服务停止,所有通知被移除,所有警报被移除,等等。在明确请求之前,不允许应用程序再次启动。

所以基本上,由应用决定,并取决于应用的编码方式。值得在“设置”>“应用”>“运行”中查看屏幕,了解每个应用的行为

请查看下面的参考链接了解更多信息。

参考链接:-

http://lifehacker.com/what-happens-when-you-remove-an-app-from-androids-mult-1179868228

http://www.howtogeek.com/169549/what-exactly-happens-when-you-swipe-an-android-app-from-the-recent-apps-list/

https://plus.google.com/+DianneHackborn/posts/GfwRYCC42uX

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多