我的应用程序在Android模拟器中工作正常,但不能在我的真实设备中工作

时间:2018-01-19 21:12:41

标签: android notifications

我的应用应该在预定义的时间内发布通知。该应用程序在模拟器中运行良好。

当我在笔记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;它在两者上工作但继续发送通知 多次(发送孔分钟通知导致我删除秒) 希望有助于找到解决方案..谢谢你们。

1 个答案:

答案 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,因为从长远来看,它会减少资源消耗并且更加精确。