我正在寻找执行简单任务的最有效方法。作为一个新的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"在这里也可能有用的课程。
答案 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()
选项,因为您特意不要求重复警报,您将继续在服务中安排它们(或者可能从活动中调度一次,然后是你可以或多或少地从服务中休息。