android服务在一个单独的线程上运行

时间:2010-11-07 00:32:30

标签: android multithreading android-service

我有一个使用广播接收器启动的应用程序,我也有一个活动和一个进程,因为服务必须始终在后台运行我正在使用android:process清单标签在它自己的进程上启动服务

ui仅用于表达需求,我希望用户能够运行该服务,即使该活动未激活。

我正在使用这个额外参数启动服务:

intent.putExtra(Intent.EXTRA_DONT_KILL_APP, true);

问题是,当我按下后退按钮或主页按钮时,调用destroy方法上的活动并且服务虽然看起来正在运行(它出现在任务管理器上)但它的行为不符合预期,它应该连接到net并发送一些数据,但是每隔X次使用一个计时器任务,但任务永远不会触发,因此数据永远不会发送。

2 个答案:

答案 0 :(得分:1)

  

因为服务必须始终在后台运行

请不要那样做。首先,这是不可能的,因为Android会杀了你,用户会杀了你。考虑到你在当前的实施中浪费了多少RAM,两者都会试图更快地杀死你。

  

我使用android:process清单标记在它自己的进程上启动服务。

请不要这样做。你在浪费RAM而没有任何好处。您无需为此服务提供单独的流程。

  

我正在使用这个额外参数启动服务:

该参数不符合您的想法。它不用于启动服务。

  

它应该连接到网络并发送一些数据,但每次X时间使用一个计时器任务,但任务永远不会触发,因此数据永远不会发送。

步骤1:摆脱现有服务。

第2步:使用AlarmManagerWakefulIntentService。安排一个警报(可能使用你的启动时间接收器)“每X次”调用。让WakefulIntentService“连接到网络并发送一些数据”。

答案 1 :(得分:0)

我完全同意CommonsWare的回答。但是,如果你真的想用另一个无用的服务打扰用户,那么你可以使用以下内容: - / -

在您的活动中:

Intent serviceIntent = new Intent(this, UpdateService.class);
serviceIntent.setAction(Intent.ACTION_MAIN);
startService(serviceIntent);

在您的服务中:

public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent != null) {
        .. do something here
    }
    return Service.START_STICKY;
}

同样,请不要只是为了定期执行某些操作。请使用AlarmManager!