繁体   English   中英

在Android Studio中接收通知

[英]Receiving Notifications in android studio

我正在尝试向用户发送通知,以提醒他每天10 AM使用我的应用程序执行特定操作。

我的问题是,仅当我在上午10点打开此应用时,我才收到通知。 从那时起,每次我打开该应用程序时,我都会收到一条通知。 因此,如果我在10:03 AM打开它,则会收到通知。

这是我的MainActivity:

public void sendNotification() {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 10);// 10 am
    cal.set(Calendar.MINUTE, 03);
    cal.set(Calendar.SECOND, 00);
    cal.set(Calendar.MILLISECOND, 00);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, NotificationReceiver.class);
    PendingIntent pendingIntent1 = PendingIntent.getBroadcast(this, 0 , intent , 0 ) ;
    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pendingIntent1);
}

我正在使用onCreate()方法调用我的方法

AndroidManifest:

<receiver
        android:name=".NotificationReceiver"
        android:enabled="true"
        android:exported="true">
</receiver>

NotificationReceiver:

    String NOTIFICATION_CHANNEL_ID = "001";
    Calendar calendar = Calendar.getInstance();
    if( calendar.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY  ) { //  Friday ? dont send a notificatoin : send a notification !
        Intent main_intent = new Intent(context , MainActivity.class) ;
        PendingIntent pIntent = PendingIntent.getActivity(context , 0, main_intent , 0) ;

        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_DEFAULT);

            // Configure the notification channel.
            notificationChannel.setDescription("Channel description");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
            notificationChannel.enableVibration(true);
            notificationManager.createNotificationChannel(notificationChannel);
        }

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);

        notificationBuilder.setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.dropdown)
                .setTicker("some text") // status bar message
                .setContentTitle("some text")
                .setContentText("some text")
                .addAction(R.mipmap.back,"pay Now", pIntent)
                .setContentInfo("Info");

        notificationManager.notify(1, notificationBuilder.build());
    } // END OF FRIDAY CHECK

注意:首次安装应用程序时,我还会收到通知!

首先,如果您想尝试在正好10点收到应用通知,请不要使用setInexactRepeating 使用setRepeating代替:

public void sendNotification() {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 10);// 10 am
    cal.set(Calendar.MINUTE, 03);
    cal.set(Calendar.SECOND, 00);
    cal.set(Calendar.MILLISECOND, 00);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    Intent intent = new Intent(this, NotificationReceiver.class);
    PendingIntent pendingIntent1 = PendingIntent.getBroadcast(this, 0 , intent , 0 );
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pendingIntent1);
}

其次,另一个可能的问题是,如果此问题发生在特定的手机(通常具有主动电源管理的手机,如华为,诺基亚等)上,请禁用该应用程序的电池管理。 众所周知,这些手机以杀死后台应用程序而臭名昭著,这些应用程序也会将其从发送通知中删除。

看看https://dontkillmyapp.com/

那里有针对特定手机的解决方案:

华为:

手机设置>高级设置>电池管理器>受保护的应用程序–将您的应用程序检查为受保护的

手机设置>应用>您的应用>电池>耗电量大的提示[x],屏幕关闭后继续运行[x]

手机设置>应用程序>高级(在底部)>忽略优化>按允许>所有应用程序>在列表中找到您的应用程序并设置为允许

手机设置>电池>应用启动,然后将您的应用设置为“手动管理”,并确保所有功能均已打开。

手机设置>电池>启动,然后将您的应用设置为“手动管理”,并确保所有功能均已打开。

对于其他品牌的手机,请沿此路线寻找...

编辑:

我刚刚注意到您所做的编辑,即使您是第一次安装,也会收到通知。 也许在您的日历上添加以下内容:

Calendar newDay = Calendar.getInstance();

if (cal.getTimeInMillis() < newDay.getTimeInMillis()) {
        cal.add(Calendar.DATE, 1); //add calendar to the next day instead of the time that has passed
    }

这是我使用警报管理器发送每日本地通知的方式。 您应该检查是否已设置警报。 我在这种情况下使用共享的首选项。

val pref = PreferenceManager.getDefaultSharedPreferences(context)
pref?.let {
    if (!pref.getBoolean(BundleParams.AlarmAlreadyRegistered.name, false)) {
        val alarmIntent = Intent(context, TrialNotificationAlarmReceiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(context, YOUR_CODE, alarmIntent, 0)

        val manager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager?

        val calendar = Calendar.getInstance().apply {
            timeInMillis = System.currentTimeMillis()
            set(Calendar.HOUR_OF_DAY, 13)
            set(Calendar.MINUTE, 30)
            set(Calendar.SECOND, 0)
        }

        manager?.apply {
            setRepeating(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, AlarmManager.INTERVAL_DAY, pendingIntent)
            pref.edit().apply {
                putBoolean(BundleParams.AlarmAlreadyRegistered.name, true)

            }.apply()
        }
    }
}

另外,当电话重启时,我正在使用Broad Cast接收器进行监听以重置警报。

class DeviceBootReceiver : BroadcastReceiver() {
    override fun onReceive(context:Context ?, intent:Intent ?){
        intent ?.let {
            if (intent.action == "android.intent.action.BOOT_COMPLETED") {
                // on device boot complete, reset the alarm
            }
        }
    }
}

希望这会帮助你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM