服务,IntentService,BroadcastReceiver还是AlarmManager?

时间:2014-09-10 23:58:16

标签: android service broadcastreceiver alarmmanager intentservice

我希望每个人都好。

我一直在阅读很多内容,我有点迷失,我完全不熟悉Android,我想制作应用程序。

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

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

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

-------------------活动------------------------- < / p>

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

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

}

-------------------服务------------------------- < / p>

@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 .-

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

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

1 个答案:

答案 0 :(得分:2)

回答你的第1号问题

  

如何使我的服务不被杀死并继续奔跑?

根据用户活动(如最近的任务列表,第三方任务管理器,设置中的“强制停止”等)或基于操作系统需求,您可以随时以任何理由终止包括服务在内的流程(系统RAM越来越低)。你不能阻止这种情况。

您可以采取一些措施来最小化操作系统自行决定终止您的流程的几率,例如在服务上使用startForeground(),但这会阻止用户执行用户想要的操作应用程序的过程。

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

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

      

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

    这取决于您希望使用BroadcastReceiver实现的目标。例如,如果您想在设备更改或设备的连接状态重新启动时执行某些操作,则应使用BroadcastReceiver而不是服务。

    另外请记住,您的服务不应该长时间运行或经常(例如每15-30分钟)继续运行,导致电池严重排水。

    问题3

      

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

    正如我所说,这取决于你想要实现的目标。如果使用Service,则不需要使用BroadcastReceiver,反之亦然。

    如果您只想以定期方式执行某项特定的后台任务(例如每天一次或两天一次),那么您应该使用AlarmManagerPendingIntent来安排{{1}在预定的时间,服务将自动启动,它将执行它想要做的事情,并且一旦完成任务,服务就需要停止。在下一个预定的时间,服务将开始再次,做它的工作,然后停止。这个过程继续。