我的应用应该在预定义的时间内发布通知。该应用程序在模拟器中运行良好。
当我在笔记3(在Lollipop 5.0中工作)中测试时,通知根本没有显示.. !!
我不知道问题是什么,因为它在模拟器中工作正常。
以下是构建和触发通知的方法:
private static String customTime = "13:08:00"; // ( Temp ) for test app
private final static String[] NOTIY_TIMES = {customTime,"10:00:00","11:00:00","12:00:00","13:00:00","14:00:00","15:00:00","16:00:00","17:00:00","18:00:00","19:00:00","20:00:00","21:00:00","22:00:00"};
// This Method will build , fire notification then increase the notify counter;
public static void showNotification( Context context) {
// Notification Builder
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
.setColor(context.getResources().getColor(R.color.colorPrimary))
.setSmallIcon(R.drawable.ic_water_cup)
.setLargeIcon(largeIcon(context))
.setStyle(new NotificationCompat.BigTextStyle().bigText("Its Nice Time To Drink Cup Of Water Now.."))
.setContentTitle("Drinking Water = Healthey Life")
.setContentText("Its Nice Time To Drink Cup Of Water Now..")
.setContentIntent(openAppWhenClick(context))
.setDefaults(NotificationCompat.DEFAULT_SOUND | NotificationCompat.DEFAULT_VIBRATE)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.addAction(acceptToDrinkAction(context))
.addAction(cancelNotificationAction(context));
// Fire Notification
NotificationManager notificationManager = (NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE);
if (notificationManager != null) {
notificationManager.notify(NOTIFY_ID , mBuilder.build());
}
以下是我在上述预定义时间点击通知的方法:
//此方法午餐通知在一天的特定时间 public static void fireNotificationOnCertainTime(final Context context){
// Get Current Dynamic Time uses Handler
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.US);
String timeNow = sdf.format(new Date());
handler.postDelayed(this ,1000);
// Fire notification in this specific times
if (Arrays.asList(NOTIY_TIMES).contains(timeNow)) {
showNotification(context);
}
}
},10);
}
这是我的清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.islam.waterdrinkreminder">
<uses-permission android:name="android.permission.VIBRATE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".Services.Reciver"/>
<service android:name=".Services.WaterReminderJopDispatcher"
android:exported="false">
<intent-filter>
<action
android:name="com.firebase.jobdispatcher.ACTION_EXECUTE">
</action>
</intent-filter>
</service>
</application>
</manifest>
修改:
我认为我找到了导致问题的原因但仍未找到解决问题的方法 在我的代码中的时间模式中,我使用模式&#34; HH:mm:ss&#34;这种模式 在模拟器中工作,但我真正的手机无法识别.. !! 我尝试使用Pattern&#34; HH:mm&#34;它在两者上工作但继续发送通知 多次(发送孔分钟通知导致我删除秒) 希望有助于找到解决方案..谢谢你们。
答案 0 :(得分:1)
我假设发生了这种情况,因为您的模拟器正在运行Android O(它会更改通知的管理方式)。有关如何添加对Android O的支持的深入报道,我建议您查看this documentation。
但缺点是你现在需要为所有通知添加一个频道。以下是文档中的代码摘录:
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// The id of the channel.
String id = "my_channel_01";
// The user-visible name of the channel.
CharSequence name = getString(R.string.channel_name);
// The user-visible description of the channel.
String description = getString(R.string.channel_description);
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel mChannel = new NotificationChannel(id, name, importance);
// Configure the notification channel.
mChannel.setDescription(description);
mChannel.enableLights(true);
// Sets the notification light color for notifications posted to this
// channel, if the device supports this feature.
mChannel.setLightColor(Color.RED);
mChannel.enableVibration(true);
mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
mNotificationManager.createNotificationChannel(mChannel);
[编辑]
我看到你提到SimpleDateFormat不起作用,我实际上不确定为什么会这样。但是在另外一个注意事项中,我不建议你按时计时通知(有一系列有效时间和一个延迟10ms的处理程序)。
在Android中,您可以访问AlarmManager
。可以找到有关如何实施重复警报的文档here。
使用AlarmManager
,您可以根据已用时间关闭闹钟,或者您可以在非常特定的时间唤醒闹钟。上面的链接应该告诉你它是如何工作的。下面是一个小代码示例,显示了一个可能会产生警报的解决方案,该警报会在一小时内触发服务。
alarmMgr.setInexactRepeating(
// Wake the device based on elapsed time
AlarmManager.ELAPSED_REALTIME_WAKEUP,
// Trigger 30 minutes after this call
SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_HALF_HOUR,
// Keep triggering every hour
AlarmManager.INTERVAL_HOUR,
// The intent to trigger - likely waking some Service to do a job
alarmIntent);
AlarmManager
的其他用途允许您设置开始的具体时间。有关用于计划的Android组件的更多选项,您可以查看this page of the documentation。
如果确实想要继续使用Handler
,那么您的数组实际上可能是一个时间映射,它对应于一个布尔值,表示通知是否已经过发送了。然后可以在一天结束时(或者一旦击中最后一次)重置此地图。或者还有很多其他方法可以优化Handler
/ Array
方法 - 这只是一个需要最少更改的想法。无论如何,我建议使用AlarmManager
,因为从长远来看,它会减少资源消耗并且更加精确。