【问题标题】:Service, IntentService, BroadcastReceiver or AlarmManager?服务、IntentService、BroadcastReceiver 还是 AlarmManager?
【发布时间】:2014-09-10 23:58:15
【问题描述】:

希望大家都好。

我读了很多书,有点迷茫,我对 Android 完全陌生,我想制作一个应用程序。

我的第一个方法是做一个活动,但我需要我的应用程序继续运行,所以我开始思考和使用服务。实际上问题是我需要服务永不停止,当手机重新启动或重新启动以再次启动服务时也是如此。

我已经弄清楚如何在重启/重启后启动服务。

我正在做的是以这种方式从我唯一的活动开始我的服务:

-------------------- 活动 -------------

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    startService(new Intent(MyActivity.this, MyService.class));

}

-------------------- 服务 -------------

@Override
public void onCreate() {
    Toast.makeText(this, "Auto Service Created onCreate", Toast.LENGTH_LONG).show();   
}

@Override
public int onStartCommand(Intent intent, int flags, int startId){
    Timer timer;

    Toast.makeText(this, "Auto Service onStartCommand", Toast.LENGTH_LONG).show();

    int delay = 5000; // delay for 5 sec.
    int period = 5000; // repeat every sec.

    timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask(){
        public void run() 
        {
            System.out.println("Auto Service: Runing!");
        }   
    }, delay, period);


    return START_STICKY;
}

如果活动正在运行或在后台运行,它确实可以完美运行,但是当它被发送到任务列表并且我从那里手动消除它时,服务会停止,我不希望这种情况发生。

问题。-

1.- ¿如何使我的服务不被杀死并继续运行?

2.- ¿ 让 BroadcastReceiver 获得特定意图然后执行我的活动会更好吗? (改善电池以改善电池消耗)

3.- 如果问题 2 是更好的方法,¿我还需要服务还是可以依赖活动?

提前谢谢你!!!

编辑 1.-

实际上我想要实现的是在屏幕打开时启动一个活动(还不知道在屏幕关闭或屏幕打开时启动它是否更好)做一些工作然后完成活动。

然后在每次屏幕打开时再次重复活动,甚至在手机重新启动或重启时继续运行或开始运行活动,就像锁屏应用一样。

【问题讨论】:

    标签: android service broadcastreceiver alarmmanager intentservice


    【解决方案1】:

    回答你的第一个问题

    如何让我的服务不被杀死并继续运行?

    您的进程(包括服务)可以基于用户活动(例如最近的任务列表、第三方任务管理器、设置中的“强制停止”等)或基于操作系统的需要随时以任何原因被终止(系统 RAM 越来越低)。你无法阻止这一点。

    您可以采取一些措施来尽量减少操作系统自行决定终止您的进程的可能性,例如在服务上使用startForeground(),但这确实会阻止用户对您的应用进程执行用户想要的操作.

    所以系统可以终止服务,有两种方法可以解决这个问题:

    1. 如果您正在实施该服务,请覆盖 onStartCommand() 并返回 START_STICKY(您现在正在执行的操作)作为结果。它会告诉系统,即使由于内存不足而想终止您的服务,它也应该在内存恢复正常后立即重新创建它。
    2. 如果您不确定第一种方法是否有效 - 您必须使用 AlarmManager http://developer.android.com/reference/android/app/AlarmManager.html 。那是一个系统服务,它会在您告知时执行操作,例如定期执行。这将确保如果您的服务将被终止,甚至整个进程都会终止(例如强制关闭) - 它会在预定时间由AlarmManager 100% 重新启动。

    第二个问题

    让 BroadcastReceiver 获得特定意图然后执行我的活动会更好吗?

    这取决于你想用BroadcastReceiver 实现什么。例如,如果你想在设备的连接状态改变或设备重启时做某事,你应该使用BroadcastReceiver 而不是服务。

    另外请注意,您的服务不应长时间运行或过于频繁地运行(例如每 15-30 分钟一次),否则会导致大量电池耗尽。

    第三个问题

    如果问题 2 是更好的方法,¿我还需要服务还是可以依赖活动?

    正如我所说,这取决于您要达到的目标。没有这样的规则,即如果您使用 BroadcastReceiver,则需要使用 Service,反之亦然。

    如果您只想定期执行某些特定的后台任务(例如每天一次或每 2 天一次),那么您应该使用AlarmManagerPendingIntent 来安排您的Service。在预定的时间时间,服务将自动启动,它会做它应该做的事情,一旦它完成任务,服务需要停止。再次在下一个预定时间服务将再次启动,做它的工作和然后停止。这个过程继续。

    【讨论】:

    • 其实我想要实现的是在屏幕亮起时启动一个活动(还不知道是在屏幕熄灭时还是屏幕亮起时启动它更好)做一些工作然后完成活动。然后在每次屏幕打开时再次重复该活动,甚至在手机重新启动或重启时继续运行该过程,就像锁屏应用一样。
    • Activity 还是 Service?你到底想以这种方式做什么?这会导致大量电池耗尽。所以我不鼓励这样做。但是我需要知道你到底想做什么?当你说do some work then finish the activity时,你所说的做一些工作是什么意思?
    • 我想注册用户的活动,处理信息并存储它,完成后我不需要活动/服务“运行”更有可能睡着并唤醒它当屏幕再次亮起时重复整个过程。这样可以节省电池。我对使用服务或活动有点困惑。什么会更好?谢谢!
    • 好的。您可以在 ActivityonResume() 内执行此操作。请参阅 this documentation of pausing and resuming activity。但再重复一遍,如果您如此频繁地启动服务,那么您将导致电池耗尽。但是如果它不是一项服务,而只是一般要执行的一些任务,那么您可以在您的活动的onResume() 内执行此操作。onResume() 建议您的活动集中在您的屏幕上。如果它,请接受这个作为正确答案帮助了你。你也可以投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多