Android - 正确停止定期服务

时间:2014-11-30 12:08:00

标签: android android-service alarmmanager android-pendingintent android-alarms

我想知道这是否是阻止我定期调用service的正确方法。我的isServiceStopped中有一个静态布尔变量MainActivity,我可以通过点击按钮开始或停止正在进行的service。如您所见,我使用onDestroy()AlarmManager方法中重新安排了我的服务,所以如果我在我的MainActvity中调用stopService(),它只会销毁服务但重新安排它,所以不会有任何服务影响。 这就是为什么我使用一个标志,一个静态布尔变量,我可以在我的MainActivity中设置:如果我点击按钮停止服务我设置这个标志true并且服务将不会再次重新安排,因为它将不能在onDestroy()方法中运行。

这是有效的,但我个人认为这只是一个糟糕的解决方法,因为如果我关闭应用程序,如果只运行服务,系统将如何找到静态变量?那么这样做的正确方法是什么?我应该将重新安排部分放在onStartCommand()吗?

谢谢!

public class AsyService extends Service {

        @Override
        public IBinder onBind(Intent i) {       
            return null;
        }

        @Override
        public void onCreate() {
            super.onCreate();               
        }

        @Override
        public void onStart(Intent intent, int startId) {   
            super.onStart(intent, startId); 
         }   

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
            return START_NOT_STICKY; 
        }


        @Override
        public void onDestroy() {  
            //Right now I have a static variable defined in MainActivity to set the boolean isServiceStopped 
            if (!MainActivity.isServiceStopped){
                AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
                alarm.set(
                    AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis() + (1000 * 15),
                    PendingIntent.getService(this, 0, new Intent(this, AsyService.class), 0)
                );
            }

        }

    }

MainAcvitiy:

btn2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 1, new Intent(MainActivity.this, AsyService.class), PendingIntent.FLAG_UPDATE_CURRENT);
            AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
            alarm.cancel(pendingIntent);

        }
    });

1 个答案:

答案 0 :(得分:0)

正确的方法是重新创建原始待处理意图,取消它,并从警报管理器中删除该服务。我不知道你为什么要从内部终止服务。

PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(pendingIntent);