如何在android上安全地停止服务并退出进程

时间:2014-02-28 01:36:14

标签: android service

我想实现像。 这样的后台服务。当网络可用时,启动服务,否则,停止它包括进程 。(此应用程序没有活动)。这是我实现它的方式。

1.注册一个静态的boardcastReceiver.Listener以下的广播

<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 

2.在 onReceive 方法中。启动或停止服务组件的操作。

@Override
public void onReceive(Context context, Intent intent) {
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    Intent service = new Intent(context,MonitorService.class);
    boolean running = isMyServiceRunning(context);
    if (null != activeNetwork) {
        if (!running){
            Log.i(TAG,"Network avaliable, start Service ");
            context.startService(service);
        }
    } else {
        if (running){
            Log.i(TAG,"Network unavaliable, stop Service ");
            context.stopService(service);
        }
    }
}

3.我发现真的很有趣。首先我们安装应用程序。现在它没有运行。然后我打开WiFi .logcat输出的东西,现在我很确定服务正在运行。我有一个单独的线程在服务内创建。当我禁用WiFi时。调用服务回调方法onDestory。这里我将销毁我之前创建的线程以释放资源等。

一切看起来都正常。现在服务组件停止,没有活动。但是进程仍然活着!! 我只是调用 android.os.Process.killProcess(android.os。 onDestory中的Process.myPid())。但它没有任何意义。

4.在服务中:如果服务已被系统杀死,则应自动重启。如果我自己停下来,那就不应该。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG,"onStartCommand " + flags);
    return START_STICKY;
}

任何帮助都是合适的。祝你有个美好的一天。:D

添加更多============================================= ==========

我读了关于进程和threads.found的android开发者文档。 http://developer.android.com/guide/components/processes-and-threads.html

清空流程 一个不包含任何活动应用程序组件的进程。保持这种进程活着的唯一原因是缓存目的,以便在下次组件需要运行时改善启动时间。系统通常会杀死这些进程,以便在进程缓存和底层内核缓存之间平衡整个系统资源。

无论如何,我知道当我停止服务时,进程变为空进程,内存消耗减少,可能不活动。但我还是想杀了它。

0 个答案:

没有答案