android - 服务在销毁后被创建两次

标签 android service background-process

我有一项服务每 15 分钟发送一次 GPS 更新。问题是一旦我销毁我的服务并重新启动它,现在运行的服务是 2,而我只期望 1。当我已经停止并启动一个新服务时,前一个服务正在再次执行。如需进一步引用,以下是我创建服务的方式。

Intent i = new Intent(this, BGService.class);

我在单击按钮的方法上启动服务:

startService(i);

这是我的服务:

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    intent = new Intent(BROADCAST_ACTION);
    powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
            "MyWakeLock");
}

@Override
public void onStart(Intent intent, int startId) {
    handler.removeCallbacks(sendWakeLock);
    handler.postDelayed(sendWakeLock, 1000); // 1 second   
    Log.i("onStart", "onStart");
}

@Override
public void onDestroy(){
    super.onDestroy();
    Log.i("onDestroy", "onDestroy");
}

private Runnable sendWakeLock = new Runnable() {
    public void run() {     
        try
        {
            if(!stopSend)
            {
                sendGPSUpdate();
            }
        }
        finally
        {
            if(wakeLock != null) {
                if(wakeLock.isHeld()) {
                    wakeLock.release();
                }
                wakeLock = null;
            }
        }
        handler.postDelayed(this, 900000);
    }
};

 private void sendGPSUpdate()
 {
     sendBroadcast(intent);
 }

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

然后回到我的 Activity ,我单击另一个关闭应用程序的按钮,我这样做:

stopService(i);
finish();

补充一下,我有一个广播接收器:

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("Broadcast", "Recieved!");
            UpdateCurrentLocati on();
            if(BGService.wakeLock == null) {
                PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
                BGService.wakeLock = powerManager.newWakeLock(
                        PowerManager.PARTIAL_WAKE_LOCK, 
                        "Tag");
            }
            if(! BGService.wakeLock.isHeld()) {
                BGService.wakeLock.acquire();
            }
        }
 };

再一次,当我启动应用程序并再次启动服务时,正如我所说,我有两个正在运行的服务正在发送 gps 更新。顺便说一句,这是后台进程。有任何想法吗?谢谢!

最佳答案

我没有在您的代码中看到 onStartCommand 的实现,我按以下方式使用它:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
 startRecording();// start audio capture in the background
 return  Service.START_STICKY;// maybe you should use START_NOT_STICKY or IntentService
}

我已经多次停止和启动此服务,没有加倍或任何其他问题。 还有其他选项,例如,如果您的服务停止,Android 操作系统将自动重新启动您的服务,您可以在此处查看文档: http://developer.android.com/reference/android/app/Service.html#START_STICKY

编辑:当我们调用 startService 时,会调用 onStartCommand。如果您多次调用 startService,可能会生成多个基于您的方法 sendWakeLock 的线程。

关于android - 服务在销毁后被创建两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18981121/

相关文章:

java - HttpURLConnection PUT 到 Google Cloud Storage 给出错误 403

java - Android:从字符串值中提取链接

android - 绑定(bind)服务中的设计模式?

objective-c - CoreBluetooth——在设备锁定时发现 BLE 外围设备

javascript - 科尼后台服务

java - OkHTTP (v3.0.0-RC1) 带参数的 Post 请求

android - Eclipse 不更新 android sdk 列表

android - 有什么办法可以强制不重新创建 IntentService 吗?

image - gitlab ci yml 图像和服务机制?

ios - 如何让一段代码在后台保持事件状态?