繁体   English   中英

需要一些帮助来解决安排每日通知的代码

[英]Need some help troubleshooting code that schedules daily notifications

我是 android 编程的新手,最近才开始开发我的第一个应用程序。 我正在尝试创建用户每天在同一时间收到的每日通知。 我查看了文档和一些教程并提出了这个。 由于某种原因,下面的代码不起作用。 它没有错误,运行得很好,但不能完成工作,我似乎找不到问题所在。 还有一些代码负责在设备重新启动时重新安排通知,但我认为问题不存在,因为我什至没有收到初始通知。

主活动.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    show = (Button)findViewById(R.id.btn_show);
    show.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startAlarm(true,true);
        }
    });

    myWebView = (WebView)findViewById(R.id.webView1);
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    myWebView.loadUrl("http://google.com");
    myWebView.setWebViewClient(new WebViewClient());
}

private void startAlarm(boolean isNotification, boolean isRepeat) {
    AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    Intent myIntent;
    PendingIntent pendingIntent;

    // SET TIME HERE
    Calendar calendar= Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY,14);
    calendar.set(Calendar.MINUTE,45);


    myIntent = new Intent(MainActivity.this,AlarmNotificationReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(this,0,myIntent,0);


    if(!isRepeat)
        manager.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime()+3000,pendingIntent);
    else
        manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY,pendingIntent);
}

警报通知接收器.Java

public class AlarmNotificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

        Intent myIntent = new Intent(context, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(
                context,
                0,
                myIntent,
                FLAG_ONE_SHOT );

        builder.setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Zodiac")
                .setContentIntent(pendingIntent)
                .setContentText("Check out your horoscope")
                .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND)
                .setContentInfo("Info");

        NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1,builder.build());
    }
}

它应该基本上在按下按钮后的 14:45 安排通知,但由于某种原因它没有。

  1. 由于 Android Oreo,隐式广播接收器在以下情况下将无法工作
    在 AndroidManifest.xml 中注册

    1. 要在应用程序中使用隐式接收器,您需要在代码中使用 registerReceiver() 以编程方式定义它们。

3.使用 registerReceiver() 我们可以在活动的生命周期内以编程方式注册和取消注册Receiver()。 这样,隐式接收器只会在我们的活动/应用程序处于活动状态时被调用,而不会在其他时间被调用。

我们工作正常:

     [public class MainActivity extends AppCompatActivity {
            Button  show;
            WebView  myWebView;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

             // register custom intent filter

               *registerReceiver(new AlarmNotificationReceiver(),new IntentFilter(Intent.ACTION_BATTERY_CHANGED));*

\[enter image description here\]\[1\]
                show = (Button)findViewById(R.id.btn_show);
                show.setOnClickListener(new View.OnClickListener() {
                    @RequiresApi(api = Build.VERSION_CODES.N)
                    @Override
                    public void onClick(View v) {
                        startAlarm(true,true);
                    }
                });
                myWebView = (WebView)findViewById(R.id.webView1);
                WebSettings webSettings = myWebView.getSettings();
                webSettings.setJavaScriptEnabled(true);
                myWebView.loadUrl("http://google.com");
                myWebView.setWebViewClient(new WebViewClient());
            }
            @RequiresApi(api = Build.VERSION_CODES.N)
            private void startAlarm(boolean isNotification, boolean isRepeat) {
                AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
                Intent myIntent;
                PendingIntent pendingIntent;
                // SET TIME HERE
                Calendar calendar= Calendar.getInstance();
                calendar.set(Calendar.HOUR_OF_DAY,14);
                calendar.set(Calendar.MINUTE,45);
                myIntent = new Intent(MainActivity.this,AlarmNotificationReceiver.class);
                pendingIntent = PendingIntent.getBroadcast(this,0,myIntent,0);
                if(!isRepeat)
                    manager.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime()+3000,pendingIntent);
                else
                    manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY,pendingIntent);
            }
        }][1]

1)但以上代码可能不适用于所有版本,即通知不会出现在奥利奥(8.0)及以上版本。因为 NotificationBuilder 已被弃用且后台执行限制。

2)使用通知渠道。像下面

使用此代码。希望它工作正常!!!

void issueNotification() 
{ 

    // make the channel. The method has been discussed before. 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 
        makeNotificationChannel("CHANNEL_1", "Example channel", NotificationManager.IMPORTANCE_DEFAULT); 
    } 
    // the check ensures that the channel will only be made 
    // if the device is running Android 8+ 

    NotificationCompat.Builder notification = 
                new NotificationCompat.Builder(this, "CHANNEL_1"); 
    // the second parameter is the channel id. 
    // it should be the same as passed to the makeNotificationChannel() method 

    notification 
        .setSmallIcon(R.mipmap.ic_launcher) // can use any other icon 
        .setContentTitle("Notification!") 
        .setContentText("This is an Oreo notification!") 
        .setNumber(3); // this shows a number in the notification dots 

    NotificationManager notificationManager = 
                (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 

    assert notificationManager != null; 
    notificationManager.notify(1, notification.build()); 
    // it is better to not use 0 as notification id, so used 1. 
}

暂无
暂无

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

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