我有活动,启动/停止服务。还有一个有循环的服务。我目前正试图停止主要活动的服务。我尝试了很多变种但没有调用onDestroy:/。任何帮助,想法或教导将不胜感激。 :)
部分来自我的主要活动,我尝试使用对话框停止服务:
private void AlertDialog() {
new AlertDialog.Builder(this)
.setTitle("Delete entry")
.setMessage("Are you sure?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
stopService(intent);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.show();
服务
public class SensMessageService extends Service{
public final String APP = "Ultimator";
public final String PREF_IN_USE = "inuse";
public final String PREF_TOTAL_MESSAGES = "totalmes";
public final String PREF_LEFT_MESSAGES = "leftmes";
public final String MESSAGE_BODY = "sms_body";
public final String MESSAGE_RECEIVER = "sms_receiver";
public final String MESSAGE_REPEATS = "sms_repeats";
public final String TAG = "SensMessageService";
private IBinder ibinder;
private SharedPreferences prefrences;
@Override
public IBinder onBind(Intent arg0) {
return this.ibinder;
}
public class LocalBinder extends Binder{
SensMessageService getBinder(){
return SensMessageService.this;
}
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}
@Override
public void unbindService(ServiceConnection conn) {
// TODO Auto-generated method stub
super.unbindService(conn);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
stopSelf();
Toast.makeText(getApplicationContext(), "Stopped", Toast.LENGTH_LONG).show();
}
@Override
public void onStart(Intent intentas, int startId) {
final Intent intent = intentas;
SmsManager smsManager = SmsManager.getDefault();
int repeat = Integer.parseInt(intent.getStringExtra(MESSAGE_REPEATS));
String sendTo = intent.getStringExtra(MESSAGE_RECEIVER);
String myMessage = intent.getStringExtra(MESSAGE_BODY);
for (int i=0; i<repeat; i++) {
smsManager.sendTextMessage(sendTo, null, myMessage, null, null);
}
super.onStart(intent, startId);
}
}
我认为不会以某种方式调用onDestroy:/,因为我没有看到吐司
更新
我添加了一个帖子,但不知怎的,它没有打印出来
@Override
public void run() {
try {
while(true) {
sleep(1000);
System.out.println("fff");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
答案 0 :(得分:2)
由于您使用的是getApplicationContext()
,因此您看不到祝酒词。
将Log.e("myservice", "sadsad")
放在onDestroy()
中,以检查它是否被称为
答案 1 :(得分:2)
首先,onStart()
已弃用大约四年。请使用onStartCommand()
。
其次,请在后台线程中进行短信工作,而不是当前正在进行的主要应用程序线程。
第三,不要在stopSelf()
中致电onDestroy()
。如果您的服务达到onDestroy()
,则不需要stopSelf()
。
关于您报告的问题,您将在调用onDestroy()
之前处理整个循环,因为您已经实现了它。这是因为在主应用程序线程上调用onStart()
和onDestroy()
,对话框的onClick()
方法也是如此。一个线程一次只能做一件事,只要你用你的短信发送循环捆绑主应用程序线程,你将无法按下按钮,你将无法停止服务。
如果将SMS发送逻辑移动到后台线程中,那么在onDestroy()
中你可以做一些事情来导致该线程终止(例如,让线程看一个AtomicBoolean
,你翻转来自onDestroy()
)。
答案 2 :(得分:1)
当您致电stopService(intent);
时,它肯定会致电您onDestroy()
的{{1}}。问题可能是您的服务的Service
中没有Runnable / Thread。因此,在onDestroy()
服务中调用stopSelf();
没有任何意义,因为只有在服务停止时才会调用onDestroy()
。
答案 3 :(得分:1)
如果您是绑定服务,则在您stopService
明确呼叫unbindService(connection);
之前,呼叫Activity
将不会停止服务。来自文档
Note that if a stopped service still has ServiceConnection objects bound to it with the BIND_AUTO_CREATE set, it will not be destroyed until all of these bindings are removed
请参阅here