首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >应用程序从最近的应用程序列表中划出后,Android服务崩溃

应用程序从最近的应用程序列表中划出后,Android服务崩溃
EN

Stack Overflow用户
提问于 2013-09-04 19:42:25
回答 3查看 11.9K关注 0票数 24

我有一个由活动启动(而不是绑定)的服务。如果活动被破坏(例如,按下back按钮),服务将继续运行,这当然是有意的。但是,如果我将该活动从“最近的应用”列表中划出,该服务将立即重新启动。这是可重现的,每次将活动/应用程序从列表中划出时,都会有一个对服务的onCreate-method的新调用。中间没有对onDestroy的调用!

首先,我认为服务被android杀死了,尽管我看不出有什么理由杀死它(活动和服务都不做消耗资源的事情,实际上它们都是极简主义的,什么也不做)。但是后来我注意到这个服务实际上崩溃了。

代码语言:javascript
复制
V/MainActivity(856): onDestroy // swipe out of the list
I/ActivityManager(287): Killing 856:com.example.myapp/u0a10050: remove task
W/ActivityManager(287): Scheduling restart of crashed service com.example.myapp/.TestService in 5000ms

代码并不值得一提,但它在这里

活动:

代码语言:javascript
复制
public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.v(TAG, "onCreate, starting service...");
        startService(new Intent(this, TestService.class));
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.v(TAG, "onStart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.v(TAG, "onDestroy");
    }

    //[...]
}

服务:

代码语言:javascript
复制
public class TestService extends Service {

    private static final String TAG = "Service";

    // onBind omitted

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v(TAG, "onDestroy");
    }

}

简而言之:我的服务独立于活动的生命周期,但前提是我不删除最近应用列表中的应用。在这种情况下,服务将重新启动,但不调用onDestroy。

每次发生这种情况时,不仅服务的状态会丢失,而且服务正在做的工作也会丢失。我只想知道为什么刷卡就是这个原因。

EN

回答 3

Stack Overflow用户

发布于 2013-12-11 19:07:34

也许这可能是清单中定义的广播接收器的问题。

您是否在应用程序级别的清单中定义了一些接收器/意图过滤器?我曾经遇到过类似的问题,这是由于接收者在应用程序级别的清单中声明的。

票数 0
EN

Stack Overflow用户

发布于 2015-11-09 17:33:09

通过刷卡,你的进程不能保证会被系统杀死。不是的。您只需删除应用程序任务(或后台堆栈)。申请任务不等于申请进程。

因此,如果您有任何后台作业(线程、服务等)绑定到您的后台堆栈,并且您有一个很好的取消策略。如果适合以后使用,系统可能会尝试缓存您的进程。

但是,如果您从任务管理器中终止应用程序进程,那么这意味着您的进程将被系统积极地删除,从而删除您的JVM/沙箱。

票数 0
EN

Stack Overflow用户

发布于 2013-10-24 19:43:48

使用*START_NOT_STICKY*作为onStartCommand返回

代码语言:javascript
复制
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.v(TAG, "onStartCommand");
    return START_NOT_STICKY;
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18612880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档