当前位置:  开发笔记 > 前端 > 正文

如何在特定时间在Android上发出通知?

如何解决《如何在特定时间在Android上发出通知?》经验,为你挑选了3个好方法。

我想在特定时间通知我的应用.每天说我必须在上午7点发出通知,即使该应用程序已关闭.

我怎样才能做到这一点?任何教程?请提及链接.



1> 小智..:

首先,您需要使用广播接收器.并且因为广播接收器只能在短时间内启动

来自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);

我希望这能帮到您.



2> Vasily Kabun..:

由于后台服务限制(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:

    扩展你ServiceJobIntentService而不是IntentService和使用onHandleWork方法而不是onHandleIntent.

    加入android:permission="android.permission.BIND_JOB_SERVICE"ServiceAndroidManifest.xml.



3> SaNtoRiaN..:

您可以使用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);
        }
    }
}

将权限添加到清单



然后注册您的接收器


    
        
    


推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有