我想在特定时间通知我的应用.每天说我必须在上午7点发出通知,即使该应用程序已关闭.
我怎样才能做到这一点?任何教程?请提及链接.
首先,您需要使用广播接收器.并且因为广播接收器只能在短时间内启动
来自android开发人员博客.当处理广播时,应用程序将获得一组固定的时间(当前为10秒)来完成其工作.如果它在那段时间内没有完成,那么应用程序被认为是行为不端,并且如果需要,它的进程立即被抛入后台状态以便为内存被杀死.
在这里使用意图服务是一个更好的做法,你有一个例子如何做到这一点.
这是广播接收器类.
public class MyReceiver extends BroadcastReceiver { public MyReceiver() { } @Override public void onReceive(Context context, Intent intent) { Intent intent1 = new Intent(context, MyNewIntentService.class); context.startService(intent1); } }
并在清单中注册.
这是意图服务类.
public class MyNewIntentService extends IntentService { private static final int NOTIFICATION_ID = 3; public MyNewIntentService() { super("MyNewIntentService"); } @Override protected void onHandleIntent(Intent intent) { Notification.Builder builder = new Notification.Builder(this); builder.setContentTitle("My Title"); builder.setContentText("This is the Body"); builder.setSmallIcon(R.drawable.whatever); Intent notifyIntent = new Intent(this, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 2, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT); //to be able to launch your activity from the notification builder.setContentIntent(pendingIntent); Notification notificationCompat = builder.build(); NotificationManagerCompat managerCompat = NotificationManagerCompat.from(this); managerCompat.notify(NOTIFICATION_ID, notificationCompat); } }
并在清单中注册.
然后在你的活动中设置闹钟管理器以在特定时间启动广播接收器并使用AlarmManager setRepeating方法重复此示例,下面将每天重复它.
Intent notifyIntent = new Intent(this,MyReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast (context, NOTIFICATION_REMINDER_NIGHT, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 60 * 24, pendingIntent);
我希望这能帮到您.
由于后台服务限制(https://developer.android.com/about/versions/oreo/background.html#services),所接受答案的解决方案将无法在Android 8 Oreo(api level 26)及更高版本上正常运行当应用程序在后台时会导致这样的异常:
java.lang.IllegalStateException: Not allowed to start service Intent xxx: app is in background
可能的解决方法之一是使用JobIntentService
:
扩展你Service
的JobIntentService
而不是IntentService
和使用onHandleWork
方法而不是onHandleIntent
.
加入android:permission="android.permission.BIND_JOB_SERVICE"
你Service
的AndroidManifest.xml
.
您可以使用AlarmManager
在指定时间设置警报
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); if (!prefs.getBoolean("firstTime", false)) { Intent alarmIntent = new Intent(this, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0); AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 7); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 1); manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean("firstTime", true); editor.apply(); }
我曾经SharedPreferences
检查过这不是第一次运行应用程序,如果是,你设置该警报,否则什么也不做,而不是每次启动你的应用程序时重置警报.发生警报时
使用a BroadcastReceiver
听
public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // show toast Toast.makeText(context, "Alarm running", Toast.LENGTH_SHORT).show(); } }
使用另一个接收器收听设备启动,以便您可以重置警报
public class DeviceBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { // on device boot compelete, reset the alarm Intent alarmIntent = new Intent(context, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 7); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 1); manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); } } }
将权限添加到清单
然后注册您的接收器