简体   繁体   English

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

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

I am new to android programming and just started working on my first app recently.我是 android 编程的新手,最近才开始开发我的第一个应用程序。 I am trying to create a daily notification that a user would get at the same time every day.我正在尝试创建用户每天在同一时间收到的每日通知。 I've looked through documentation and some tutorials and came up with this.我查看了文档和一些教程并提出了这个。 For some reason the code below does not work.由于某种原因,下面的代码不起作用。 It has no errors, runs just fine, but doesn't do the job and I can't seem to find the problem.它没有错误,运行得很好,但不能完成工作,我似乎找不到问题所在。 There is also some code that is responsible for re-scheduling notifications when the device restarts but I don't think the problem lies there since I don't even get the initial notifications.还有一些代码负责在设备重新启动时重新安排通知,但我认为问题不存在,因为我什至没有收到初始通知。

MainActivity.java主活动.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);
}

AlarmNotificationReciever.Java警报通知接收器.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());
    }
}

It should basically schedule a notification at 14:45 after pressing the button but for some reason it doesn't.它应该基本上在按下按钮后的 14:45 安排通知,但由于某种原因它没有。

  1. Since Android Oreo, implicit broadcast receivers won't work when由于 Android Oreo,隐式广播接收器在以下情况下将无法工作
    registered in the AndroidManifest.xml在 AndroidManifest.xml 中注册

    1. To use Implicit Receivers in your application, you need to define them programmatically in your code, using registerReceiver().要在应用程序中使用隐式接收器,您需要在代码中使用 registerReceiver() 以编程方式定义它们。

3.Using registerReceiver() we can programmatically register and unregisterReceiver() during the lifecycle of the activity. 3.使用 registerReceiver() 我们可以在活动的生命周期内以编程方式注册和取消注册Receiver()。 This way implicit receivers would only be called when our activity/application is alive and not at other times.这样,隐式接收器只会在我们的活动/应用程序处于活动状态时被调用,而不会在其他时间被调用。

we working fine:我们工作正常:

     [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)But the above code may not work in all versions ie notofication will not came oreo(8.0) and above.beacause of NotificationBuilder is depricated and background execution limits. 1)但以上代码可能不适用于所有版本,即通知不会出现在奥利奥(8.0)及以上版本。因为 NotificationBuilder 已被弃用且后台执行限制。Go to

2)Use Notification Channel .like below 2)使用通知渠道。像下面

use this code.hope its works fine!!!使用此代码。希望它工作正常!!!

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