我希望我的应用程序每天早上6点左右显示一条带有“GO MORNING”消息的通知。正如我读到的,为此我需要应用程序在后台运行,所以我需要使用服务。
我尝试过以下代码但是我被卡住了。
MainActivity.java
public void onClickStartService(View v)
{
startService(new Intent(this,MyService.class));
}
public void onClickStopService(View v)
{
stopService(new Intent(this,MyService.class));
}
和MyService.java是
public class MyService extends Service{
private static final String TAG = "MyService";
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
Toast.makeText(this, "Congrats! MyService Created", Toast.LENGTH_LONG).show();
Log.d(TAG, "onCreate");
}
@Override
public void onStart(Intent intent, int startId) {
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
Log.d(TAG, "onStart");
//Note: You can start a new thread and use it for long background processing from here.
}
@Override
public void onDestroy() {
Toast.makeText(this, "MyService Stopped", Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy");
}
}
我有按钮来启动和停止服务,它的工作原理。现在我想要服务创建通知,就像我在帖子开头提到的那样。我怎么能这样做?
答案 0 :(得分:4)
要在特定时间启动服务,我建议您创建一个由警报触发的BroadcastReceiver,然后启动您的服务。
首先写一个这样的BroadcastReceiver:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
context.startService(new Intent(context, MyService.class));
}
/**
* Schedule the next update
*
* @param context
* the current application context
*/
private static void scheduleServiceUpdates(final Context context) {
// create intent for our alarm receiver (or update it if it exists)
final Intent intent = new Intent(context, AlarmReceiver.class);
final PendingIntent pending = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// compute first call time 1 minute from now
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE, 10);
long trigger = calendar.getTimeInMillis();
// set delay between each call : 24 Hours
long delay = 24 * 60 * 60 * 1000;
// Set alarm
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC, trigger, delay, pending);
// you can use RTC_WAKEUP instead of RTC to wake up the device
}
}
然后,您只需调用scheduleServiceUpdate方法即可启动reccuring事件。如果您只使用RTC类型,那么如果在警报触发服务时手机被锁定,它将不会等待,直到用户解锁设备。如果您使用RTC_Wakeup,服务将在给定的时间准确启动。
请注意,AlarmManager中还有其他方法可以触发事件。
答案 1 :(得分:3)
您可以从PendingIntent和AlarmManager
开始别忘了添加使用
取消闹钟管理器的可能性mAlarmManager.cancel(pendingIntent);
此外,如果您想按计划启动服务,您可能需要拦截android.intent.action.BOOT_COMPLETED事件以使应用程序在重新启动后立即启动。