android-service - 即使通过多任务屏幕停止应用程序,有什么方法可以不停止服务吗?
问题描述
当应用程序关闭时,我的服务会停止。
代码已经提供。
我的服务代码是:
public class MusicService extends Service {
MediaPlayer myPlayer;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Toast.makeText(this, "Service Created", Toast.LENGTH_LONG).show();
myPlayer = MediaPlayer.create(this, R.raw.nokiatune);
myPlayer.setLooping(false); // Set looping
}
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
myPlayer.start();
}
@Override
public void onDestroy() {
Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();
myPlayer.stop();
}
}
我在android中开发了一个服务。它工作正常。唯一的事情是当应用程序通过多任务屏幕关闭时服务停止。即使通过多任务屏幕关闭应用程序,有什么方法可以不停止服务吗?
解决方案
您可以尝试这里讨论的方法。基本上,您注册一个广播接收器,如果它被破坏,它会重新启动您的服务。在你的AndroidManifest.xml
:
<receiver
android:name="yourpackagename.RestartServiceBroadcastReceiver"
android:enabled="true"
android:exported="true"
android:label="RestartServiceWhenStopped">
</receiver
你的BroadcastReceiver
:
public class RestartServiceBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, MusicService.class));
}
}
然后在您的 Service 上onDestroy
,您发送一个广播,以便 BroadcastReceiver 可以重新启动您的服务。
@Override
public void onDestroy() {
Intent broadcastIntent = new Intent(this,RestartServiceBroadcastReceiver .class);
sendBroadcast(broadcastIntent);
myPlayer.stop();
}
此外,您必须将您的逻辑移动onStart
到您的服务onStartCommand
并让它返回START_STICKY
,如下所示:
@Override
public int onStartCommand() {
myPlayer.start();
return START_STICKY;
}
返回这个告诉Android不要终止你的服务——但是,不能保证Android会遵守这个并且仍然可以终止你的服务。
最后在启动Service的Activity中,需要确保在启动服务之前先检查服务是否已经存在,并在运行期间停止服务onDestroy
,以便BroadcastReceiver重新启动服务。
警告:此方法不适用于 Android O,请参阅此了解更多详细信息。