我正在尝试使用用户关闭应用程序后运行15秒的后台服务,我已经完成了运行15秒的服务(循环使用日志),当我关闭应用程序时发芽,然后它停止
另一个问题是,当我试图通过stopService(intent)
将其从主要活动中停止时;然后调用onDestroy
方法,但带循环的线程继续
..请有人帮帮我吗?
*对不起我的英语 - 没有本地人:D
public class NotificationService extends Service {
final private class MyThread implements Runnable {
int service_id;
MyThread(int service_id) {
this.service_id = service_id;
}
@Override
public void run() {
synchronized (this) {
for (int i = 0; i < 15; i++) {
try {
wait(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.e("onStartCommand", "loop:" + i);
}
stopSelf(service_id);
}
}
}
Thread thread;
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
}
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
Log.e("onStartCommand", "started");
Toast.makeText(this, "onStartCommand", Toast.LENGTH_SHORT).show();
thread = new Thread(new MyThread(startId));
thread.start();
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
Log.e("onDestroy", "onDestroy");
Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
super.onDestroy();
}
}
答案 0 :(得分:0)
我正在尝试使用用户关闭应用程序后运行15秒的后台服务,我已经完成了运行15秒的服务(循环使用日志),当我关闭应用程序时发芽,然后它停止
您的代码仅在startService(yourNotificationService)
或Activity
上调用Broadcast Receiver
时启动循环线程,而stopSelf(service_id)
负责调用它。然后用onStartCommand()
杀死它。
如果,在您从stopSelf(service_id)
返回后,您立即终止该应用而未调用START_STICKY
(即您的15秒未启动),那么您的服务将自动重启,因为{{ 1}}返回值。但是,在您致电stopSelf(service_id)
之后,您正在告诉服务部门自杀;关闭应用后,无法通过onStartCommand()
电话告知您的服务重新启动。
另一个问题是,当我尝试通过stopService(intent)将其从主活动中停止时;然后调用onDestroy方法,但是循环继续
Service
是Android组件;它是不另一个进程或线程,它在与主UI线程相同的进程和线程中运行,除非您另有指定,如here所示。
请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果您的服务要进行任何CPU密集型(例如MP3播放)或阻止(例如网络)操作,它应该生成自己的线程来执行该工作。有关此内容的更多信息,请参见进程和线程。 IntentService类可用作Service的标准实现,它具有自己的线程,用于调度其工作。
在您的情况下,调用stopService(intent)
告诉Service
停止自己,它会这样做。 不停止您启动的Thread
(MyThread
实例)。为此,您必须先使Thread
可中断;请参阅here来做到这一点。完成后,您需要更改onDestroy()
代码以实际中断MyThread
实例,如此处
@Override
public void onDestroy() {
Log.e("onDestroy", "onDestroy");
Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
thread.interrupt();
super.onDestroy();
}