需要一些帮助来排查计划每日通知的代码



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

主要活动.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

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 安排通知,但由于某种原因它没有。

自Android
  1. Oreo以来,隐式广播接收器在AndroidManifest中注册时
    将无法工作.xml

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

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

我们工作正常:

[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(但是上面的代码可能不适用于所有版本,即通知不会出现 oreo(8.0( 及以上版本.beacause 的通知生成器已弃用,后台执行限制。转到

2(使用通知通道 .like 如下

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

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. 
}

最新更新