停止活动的服务循环

时间:2013-09-16 13:28:36

标签: android service

我有活动,启动/停止服务。还有一个有循环的服务。我目前正试图停止主要活动的服务。我尝试了很多变种但没有调用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();

4 个答案:

答案 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