android服务启动进程吗,为什么我的Android服务会在进程被终止时重新启动,即使我使用了START_NOT_STICKY?...

在Android应用中,使用Context#startService()和Context#bindService()结合的方式启动服务,导致服务在应用程序被系统杀死后仍会自动重启,从而消耗电池。问题在于服务的START_NOT_STICKY策略和解除绑定操作。当切换到BIND_AUTO_CREATE模式或不绑定服务时,问题不再出现。这涉及到Android服务生命周期管理和系统恢复行为的理解。
摘要由CSDN通过智能技术生成

我的应用使用了一种模式,在这种模式下我使用Context#startService()开始了一项服务,并使用Context#bindService()进行绑定。这样我就可以独立于任何客户端是否与其绑定来控制服务的生命周期。不过,我最近注意到,无论何时我的应用程序被系统杀死,它很快就会重新启动任何正在运行的服务。在这一点上,服务将永远不会被告知停止,并且这会导致电池耗尽。这是一个最简单的例子:

我找到了一个here类似问题的人,但它并没有被诊断或解决。

服务:

@Override

public void onCreate() {

Toast.makeText(this, "onCreate", Toast.LENGTH_LONG).show();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

return START_NOT_STICKY;

}

@Override

public IBinder onBind(Intent intent) {

return new Binder();

}活动:

@Override

protected void onStart() {

super.onStart();

Intent service = new Intent(this, BoundService.class);

startService(service);

bindService(service, mServiceConnection, 0);

}

@Override

protected void onStop() {

unbindService(mServiceConnection);

Toast.makeText(this, "unbindService", Toast.LENGTH_SHORT).show();

super.onStop();

}为了测试它,我启动了应用程序,该应用程序启动了服务并绑定到该应用程序。然后我退出了应用程序,解除绑定(但保持服务运行)。然后我做到了

$ adb shell am kill com.tavianator.servicerestart并且果然,5秒钟后,出现“onCreate”吐司,表示服务再次开始。 Logcat显示了这一点:

$ adb logcat | grep BoundService

W/ActivityManager( 306): Scheduling restart of crashed service com.tavianator.servicerestart/.BoundService in 5000ms

I/ActivityManager( 306): Start proc com.tavianator.servicerestart for service com.tavianator.servicerestart/.BoundService: pid=20900 uid=10096 gids={1028}如果我将startService()模式替换为BIND_AUTO_CREATE,则问题不会发生(即使我在应用程序仍然绑定到服务时崩溃)。如果我从不与服务绑定,它也可以工作。但是,开始,绑定和解除绑定的组合似乎永远不会让我的服务死亡。

杀死应用程序之前使用dumpsys显示:

$ adb shell dumpsys activity services com.tavianator.servicerestart

ACTIVITY MANAGER SERVICES (dumpsys activity services)

Active services:

* ServiceRecord{43099410 com.tavianator.servicerestart/.BoundService}

intent={cmp=com.tavianator.servicerestart/.BoundService}

packageName=com.tavianator.servicerestart

processName=com.tavianator.servicerestart

baseDir=/data/app/com.tavianator.servicerestart-2.apk

dataDir=/data/data/com.tavianator.servicerestart

app=ProcessRecord{424fb5c8 20473:com.tavianator.servicerestart/u0a96}

createTime=-20s825ms lastActivity=-20s825ms

executingStart=-5s0ms restartTime=-20s825ms

startRequested=true stopIfKilled=true callStart=true lastStartId=1

Bindings:

* IntentBindRecord{42e5e7c0}:

intent={cmp=com.tavianator.servicerestart/.BoundService}

binder=android.os.BinderProxy@42aee778

requested=true received=true hasBound=false doRebind=false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值