2010-11-07 34 views
1

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

ui仅适用于表示需求,我希望用户能够运行该服务,即使该活动未处于活动状态。

我用这额外的参数启动服务:

intent.putExtra(Intent.EXTRA_DONT_KILL_APP, true); 

的问题是,当我按下后退按钮或home键的活动对破坏方法被调用和服务尽管看起来它的运行(它出现在任务管理器上)其行为不如预期,它应该连接到网络并发送一些数据,但每X时间使用一个计时器任务,但任务不会触发,因此数据永远不会发送。

回答

1

因为该服务必须在后台

始终运行,请不要那样做。对于初学者来说,这是不可能的,因为Android会杀了你,用户会把你杀掉。考虑到你在当前的实现中浪费了多少RAM,两者都会试图以更快的速度杀死你。

我开始使用android:process清单标记自己的进程的服务。

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

我用这额外的参数启动服务:

该参数没有做什么,你认为它。它不用于启动服务。

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

步骤#1:摆脱你现有的服务。

步骤#2:使用AlarmManagerWakefulIntentService。 “每隔X次”安排一次警报(可能使用启动时间接收器)。请将WakefulIntentService“连接到网络并发送一些数据”。

+0

感谢您的建议,但是1我使用的是大约3 MB的ram,它与在手机上运行的其他任何服务都没有太大的区别,2它用于什么(额外的参数)? 3为什么不使用单独的过程?我应该什么时候? 4我知道警报管理员,但我希望我的更新在警报管理员无法保证的特定时段进行。 – maxsap 2010-11-07 01:03:56

+0

@maxasp:1. Android不会在意。用户不会在意。 2. http://developer.android.com/reference/android/content/Intent.html#EXTRA_DONT_KILL_APP 3.因为你浪费了两倍的RAM,没有任何好处。 “AlarmManager”工作得很好,谢谢。如果您有相反的证据,请发布。 – CommonsWare 2010-11-07 01:07:57

+0

实际的应用程序是活动仅在程序第一次运行的服务,所以为什么要使用双RAM?请解释一下,android会收回活动进程使用的内存(如果我错了,请纠正我)。我已经阅读过那篇文章,那就是为什么当我说“覆盖重新启动应用程序的默认操作”的时候使用它并不会导致这些服务?不知道setRepeating方法抱歉,但我可以动态更改间隔吗?在当前形式中,服务获得关于新时间间隔的通知并设置计时器任务。 – maxsap 2010-11-07 01:40:47

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!

相关问题