【发布时间】: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