我正在创建一个应用程序,显示未来日期的通知。为了在将来显示通知,我使用了AlarmManager。
在我的一个活动中单击按钮,我会创建如下通知
Intent myIntent = new Intent(getApplicationContext(),
BootService.class);
myIntent.putExtra("stuffid", stuffId);
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(),
stuffId, myIntent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.DAY_OF_MONTH, day);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 00);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),pendingIntent);
// Tried set repeating also :(
// alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 30*1000, pendingIntent);
以下是我的BootService类代码:
public class BootService extends Service {
DBController dbController = new DBController(this);
@Override
public void onCreate() {
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
LoadAlarmsFromDatabase();
int stuffId = intent.getIntExtra("stuffid", 0);
if(stuffId > 0)
new GetStuffDataAsync().execute(stuffId);
return super.onStartCommand(intent, flags, startId);
}
private void LoadAlarmsFromDatabase() {
DBController dbController = new DBController(this);
// Iterate over array and call addnotification no of time
...
addNotification(stuff.getStuffId(), calendar);
dbController.close();
}
private void addNotification(int stuffid, Calendar cal) {
Calendar rightNow = Calendar.getInstance();
long rightNowMillis = rightNow.getTimeInMillis();
// Add to alarm only when its greate than current date
if (cal.getTimeInMillis() > rightNowMillis) {
Log.v(TAG, "addNotification " + stuffid + ", " + cal);
Intent intent = new Intent(getApplicationContext(),
BootService.class);
intent.putExtra("stuffid", Integer.toString(stuffid));
PendingIntent mAlarmSender = PendingIntent.getBroadcast(
getApplicationContext(), stuffid, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
//am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), mAlarmSender);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, mAlarmSender);
}
}
public class GetStuffDataAsync extends AsyncTask <Integer,Void,Stuff>{
@Override
protected Stuff doInBackground(Integer... params) {
int stuffId = params[0];
Stuff stuff = dbController.getStuffInfo(stuffId);
dbController.close();
return stuff;
}
@Override
protected void onPostExecute(Stuff result) {
Context ctx = getApplicationContext();
Intent notificationIntent = new Intent(ctx, AndroidAlarmService.class);
PendingIntent contentIntent = PendingIntent.getActivity(ctx,
1, notificationIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
NotificationManager nm = (NotificationManager) ctx
.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx);
builder.setContentIntent(contentIntent)
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("Reminder: " + result.getName() + " expires on " + result.getExpiresOn())
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setContentTitle("NotifyWhenMyStuffExpires")
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setContentText(result.getName() + " expires on " + result.getExpiresOn());
Resources res = ctx.getResources();
if(result.getHasPhoto() == 1){
Bitmap bm = result.getPhoto();
builder.setContentIntent(contentIntent).setLargeIcon(bm);
}
else
builder.setContentIntent(contentIntent).setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_launcher));
Notification n = builder.build();
nm.notify(1, n);
}
}
}
在测试应用程序时,我看到通知显示,问题是特定于启动手机。在上面的代码中,我通过调用LoadAlarmsFromDatabase来重新创建通知
为了处理启动时重新创建警报,我使用了BroadcastRecaver
公共类引导接收器扩展了广播接收器{
private final String TAG = "BootService";
@Override
public void onReceive(Context context, Intent intent) {
android.os.Debug.waitForDebugger();
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
android.os.Debug.waitForDebugger();
Intent mServiceIntent = new Intent(context,BootService.class);
mServiceIntent.setAction("com.whenmystuffexpires.BootService");
ComponentName service = context.startService(mServiceIntent);
if (null == service) {
// something really wrong here
Log.e(TAG, "Could not start BootService ");
Log.v(TAG, "BootReceiver - Could not start BootService ");
}
} else {
Log.e(TAG, "Received unexpected intent " + intent.toString());
Log.v(TAG, "Received unexpected intent " + intent.toString());
}
}
}
随着调试器的附加,我看到断点被击中,loadalarmfrom数据库被调用。但是没有显示通知。
以下是我的接收者在清单中的声明方式
<service
android:name=".BootService"
android:enabled="true" />
<receiver
android:name=".BootReceiver"
android:enabled="true" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
还有一些事实:
>
$am广播-android.intent.action.BOOT_COMPLETED
我正在姜饼上测试。
问题只是在重新启动手机。
显示权限:uses-权限android: name="android.permission.WAKE_LOCK"uses-权限android: name="android.permission.RECEIVE_BOOT_COMPLETED"
从您的中删除
DEFAULT
类别
普通通知生成器不会在Android O上显示通知。 如何在Android 8 Oreo上显示通知? 在Android O上显示通知是否需要添加新的代码?
奇怪的是,自定义图标在三星Mini(jelly bean)和Nexus 4(API 27)模拟器上显示正确,但在三星A6(Oreo)和华为Honory Lite 9(Oreo)设备上却显示不正确,在这些设备上,我看到了默认的绿色背景白色droid图标。 通知始终显示,但在某些设备上不使用自定义图标。 我尝试在AssetStudio中实现它,并且使用和不使用Notification Builder实
问题内容: 我查看了android文档,并查看了StackOverflow中的所有答案,但是,我似乎无法理解为什么我尝试显示的通知没有显示。每当我单击按钮时,应用程序就会崩溃,而不是显示通知,而有人可以告诉我为什么会发生这种情况吗? 这是堆栈跟踪 问题答案: 根据错误消息,您不能将其用作通知通道的ID-该名称专门为未定位API 26或更高版本的应用程序保留,用于发布未连接任何通道的所有通知。 您可
我正在使用一个android模拟器来测试通知。
仅当应用程序关闭时,数据有效负载的使用不会收到任何通知,并且不会触发消息接收方法。 在下图中显示数据负载,单击此处查看参数 回复是点击这里查看回复 响应成功1,但在redmi手机中未收到任何通知。
我正在使用Visual Studio+Xamarin开发一个Android应用程序,并尝试在Oreo(API26)上接收后台Firebase云消息通知。 问题 当我的应用程序是后台时,通知不会显示在通知抽屉中(仅在Android API 26 Oreo上)。然而,当应用程序被前景化时,通知是有效的。 注释 FCM通知适用于所有其他构建版本<26,包括后台和前台FCM消息(这些消息出现在通知抽屉中,