【问题标题】:What is the best way to deliver notification daily even if the app is killed即使应用程序被杀死,每天发送通知的最佳方式是什么
【发布时间】:2016-06-16 17:27:00
【问题描述】:

我想在指定的时间发送每日通知,我这样做了,但是当我从最近关闭应用程序时,通知根本没有发送。我不知道怎么弄明白。有人可以建议我即使应用程序已关闭(不是强制关闭)或设备已启动,发送通知的最佳方式是什么,通知必须在准确的时间。

任何帮助将不胜感激。

这是代码,

alarmreciever 类,

public class AlarmReciever extends BroadcastReceiver {

String meaning;
String word;

Context context;

@Override
public void onReceive(Context context, Intent intent) {

 this.context=context;
    FileIO fileIO=new FileIO(context);

    String res=fileIO.readFile("daily_word");
    StringTokenizer stringTokenizer = new StringTokenizer(res,"---");
   word = stringTokenizer.nextToken();
    meaning = stringTokenizer.nextToken();

    fileIO.writeFile(word+"---"+meaning,"sent_word");

    int ch= word.charAt(0);
    if(ch>=65 && ch<=90)
    {
    }
    else
        ch=ch-32;

    word=(char)ch+word.substring(1);

    produceNotificatioon(context);

    System.out.println("<> ALARM RECEiVE");



}




public void produceNotificatioon(Context context)
{
    NotificationCompat.Builder notificationBuilder=new NotificationCompat.Builder(context);
    notificationBuilder.setAutoCancel(true)
            .setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
            .setDefaults(Notification.DEFAULT_LIGHTS)
            .setContentTitle("Word of the Day")
            .setContentText("Today's Word is "+word)
            .setSmallIcon(R.drawable.app_icon_2);

    Intent myintent = new Intent(context,WordOfTheDay.class);

    TaskStackBuilder taskStackBuilder=TaskStackBuilder.create(context);

    taskStackBuilder.addParentStack(WordOfTheDay.class);
    taskStackBuilder.addNextIntent(myintent);



    PendingIntent pendingIntent=taskStackBuilder.getPendingIntent(102,PendingIntent.FLAG_UPDATE_CURRENT);

    notificationBuilder.setContentIntent(pendingIntent);

    NotificationManager notificationManager=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(0,notificationBuilder.build());


}

}

setAlarm 方法,

public void setAlarm()
{
    Intent myintent=new Intent(this,AlarmReciever.class);


    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);


    PendingIntent pendingIntent=PendingIntent.getBroadcast(this,101,myintent,PendingIntent.FLAG_UPDATE_CURRENT);

    alarmManager.cancel(pendingIntent);
    Calendar calendar=Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, NotificationTime.getInt("hour", 12));
    calendar.set(Calendar.MINUTE, NotificationTime.getInt("min", 0));
    calendar.set(Calendar.SECOND, 0);


    if(calendar.before(Calendar.getInstance()))
        calendar.add(Calendar.DATE,1);


    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY
            , pendingIntent);


    System.out.println("ALARM SET STATUS");
}

下面是一些oncreate代码,

            if(checkFirstRun()) {

            createAlert createAlert=new createAlert(this);
            createAlert.createDialog();



            setDaily_word();

            setAlarm();
            System.out.println("ALARM SET STATUS on FIRST RUN");
        }

如果是应用程序首先运行,我将设置警报,否则我将使用 timepicker 或使用服务 onCreate() 方法设置警报

这里是服务类,

public class ServiceClass extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onStart(Intent intent, int startId) {


    System.out.println("class Service started");
}

@Override
public void onTaskRemoved(Intent rootIntent) {

    System.out.println("class Service on TaskRemoved");
    //   setAlarm();

    //  onCreate();
    System.out.println("class Service on Alarm reset  oncreate");
    super.onTaskRemoved(rootIntent);
}

@Override
public void onCreate() {

    System.out.println("class Service created");
   setAlarm();   // this work if I start my application just after it is being cleared from recent apps
    super.onCreate();
}
}

这是我的清单文件, 我只使用这些权限

     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
.....
    <receiver android:name=".AlarmReciever" android:process=":remote"/>
    <service android:name=".ServiceClass"/>

【问题讨论】:

    标签: android notifications repeatingalarm


    【解决方案1】:
    1. 如果通知是FCM/GCM,它的范围在0-15分钟之间,推送的性质不能保证准确的时间。

    2. 如果您的应用在某个时间点在本地生成通知,您可以使用AlarmManager 安排an intent to start BroadcastReceiver 触发creation of notification

    【讨论】:

    • 我已经用广播接收器创建了警报。但问题是当应用程序从最近的应用程序中清除或被杀死时,警报不会出现。每当打开应用程序时,我都可以重置警报。但直到应用程序从最近删除的时间警报不起作用。
    • 您能否用代码示例更新您的问题,您如何使用警报管理器安排意图以及如何处理它?这应该有助于使问题更清晰。
    • 您能否尝试删除android:process=":remote" 并定义android:exported="true"。而不是那看不到问题。
    • Okk 会尝试,但它会做什么呢??
    • 您是否有理由在单独的进程中运行它?只是在黑暗中拍摄。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 2015-12-30
    • 2012-02-27
    相关资源
    最近更新 更多