Sleep VS alarmManager.set VS alarmManager.setRepeat VS Handler

时间:2016-10-22 22:52:17

标签: java android mobile alarmmanager intentservice

我正在寻找执行简单任务的最有效方法。作为一个新的Android开发人员,我不太确定哪些策略在内存效率方面最适合我的应用。我想其中一些方法可能会导致我不知道的线程问题。

目前,所有三种解决方案都符合要求。

这是一款非常简单的应用。我的想法是我的MainActivity启动一个IntentService,它将在应用程序打开后在后台运行。我现在需要的所有功能是在一天中随机间隔创建通知(相隔约一小时),无限期地,直到用户停止。通知以简单的void方法进行,将通知显示为文本并振动电话一次。

我的MainActivity启动IntentService:

public class MainActivity extends AppCompatActivity {

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

    Intent intent = new Intent(this, NotificationService.class);
    startService(intent);
    }
}

我的IntentService非常简单。它被称为NotificationService,扩展了IntentService,并且只覆盖onHandleIntent方法。除了super(" Service")之外,构造函数是空的。问题在于如何以最有效的方式使通知在后台全天弹出。在我的实现中,这是在所有三种方法的onHandleIntent方法中完成的。

方法一:

@Override
protected void onHandleIntent(Intent intent) {

    makeNotification();

    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

PendingIntent pintent = PendingIntent.getService(
getApplicationContext(), 0, intent, 0);

alarm.cancel(pintent);

alarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()
   + 60000 * 60, pintent);
}

请注意,有了这个,用户必须卸载应用程序才能停止通知,这是不可取的(虽然我想我可以添加一个按钮或取消意图的东西)

方法二:

protected void onHandleIntent(Intent intent) {

 makeNotification();

    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

    PendingIntent pintent =   PendingIntent.getService(
getApplicationContext(), 0, intent, 0);

    alarm.cancel(pintent);

alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,  SystemClock.elapsedRealtime()
    + 60*1000, 60000*60 ,pintent);
}

方法三:

@Override
protected void onHandleIntent(Intent intent) {

makeNotification();

   try {   
      sleep(60000 * 60);
        startService(intent);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

有人可以帮我决定这三种方法的优缺点吗?我不确定我理解哪一个是理想的,尽管他们三个都给我正确的功能。作为旁注,在我的研究中,我注意到了一个" Handler"在这里也可能有用的课程。

1 个答案:

答案 0 :(得分:1)

  

我现在需要的所有功能都是在一天中随机间隔创建通知(相隔大约一小时),无限期地,直到用户停止为止。

AlarmManager,可能是JobScheduler,是唯一可行的选择。

  

我的想法是我的MainActivity启动一个IntentService,它将在应用程序打开后在后台运行

不是真的。 IntentService只会在完成onHandleIntent()时运行(如果快速连续发送N个命令,则执行N次)。 IntentService可以运行一段时间,但它旨在处理某种业务逻辑事务。 设计为无限期运行,无论如何这样做对用户来说都是不好的。

  

有人可以帮我决定这三种方法的优缺点吗?

选项三无法使用。首先,它不可靠,因为它会在您的流程终止后停止工作。其次,它没有任何充分理由占用系统RAM的大块,用户可以将RAM用于更高效的使用。 Only have a service running when it is actively delivering value to the user。观察时钟标记并不能主动为用户提供价值。

  

我注意到了一个“Handler”类,它在这里也很有用

不,因为它会遇到与选项三相同的问题。

关于您的两个AlarmManager选项,可归结为您是否需要定期发出的警报(setRepeating())或不定期发生的警报(set())。

如果您使用setRepeating()选项,请将AlarmManager代码移出服务并进入活动。在每个警报上调用setRepeating()都没有意义 - 也没有确定的成本。毕竟,setRepeating()背后的点是它知道要重复,所以你不需要在每次出现时告诉它“哦,嘿,我知道我告诉过你最后的1,337你应该重复的时间,但是,嗯,不要忘记重复,m'kay?“。

使用set()选项,因为您特意要求重复警报,您将继续在服务中安排它们(或者可能从活动中调度一次,然后是你可以或多或少地从服务中休息。