当应用关闭时,请保持警报管理员

时间:2017-02-24 13:33:25

标签: android service broadcastreceiver alarmmanager taskmanager

我已经搜索了大约5个小时,但似乎没有答案。我的应用程序将继续跟踪来自网站的邮件对象,并且需要刷新每个X(用户定义它)的时间来检查网站上的更新,因此用户将意识到它如果他愿意,甚至可以关闭此功能(如果是这样,我将手动取消闹钟管理员。)

我需要做的是像whatsapp,facebook或gmail这样的东西,即使应用程序关闭也会检查邮件,并向用户发送一些通知。但这似乎是不可能的......我检查了“adb shell dumpsys alarm”并且警报就在那里,但仅在应用程序运行时。我知道这是预期会发生的事情,但是当应用程序关闭时,这些其他应用程序如何再次设置其AlarmMannagers?

我目前的代码:

清单

<service android:name="services.HelloService"
        android:process=":remote"/>

    <receiver android:name="entidade.NotificationPublisher">
        <intent-filter>
            <action android:name="IWillStartAuto" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

HelloService的

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    System.out.println("Hello Service Starting...");
    ArrayList<Objeto> list = new ObjetoDAO(this).getAllObjetos(); //Sets the alarms...
        for(int i=0; i<list.size(); i++){
            if(!list.get(i).isArquivado())
                list.get(i).setAlarme(this);
        }
    return START_STICKY;
}
@Override
public void onDestroy() {
    System.out.println("Hello Service Ending...");
    sendBroadcast(new Intent("IWillStartAuto"));
}
@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);
    sendBroadcast(new Intent("IWillStartAuto"));
}

NotificationPublisher的

public class NotificationPublisher extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
    ArrayList<Objeto> lista = new ObjetoDAO(context).getAllObjetos(); //list of tracked objects
    for(int i=0; i<lista.size(); i++){ 
        if(!lista.get(i).isArquivado()) //sets the AlarmMannager if users want it...
            lista.get(i).testeNotificacao(context);
    }
}}

更新:用于设置闹钟的代码... 的 AlarmManager:

public void setAlarme(Context context) {
    if (!isArquivado()) {
        int idDoAlarme = getId();
        Calendar calendar = Calendar.getInstance();
        long interval = AlarmManager.INTERVAL_FIFTEEN_MINUTES;
        Intent notificationIntent = new Intent(context, NotificationPublisher.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, idDoAlarme, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), interval, pendingIntent);
    }
}

还注意到:在我的旧手机上测试了应用程序(LG E435f,使用Android 4.1.2)并且出乎意料的是,应用程序关闭后仍然会设置警报。那么,它可能是我的手机(联想K5 A6020l36,与Android 5.1.1)?但在这种情况下,whatsapp和gmail如何在关闭应用程序的情况下在这款手机上运行警报?

3 个答案:

答案 0 :(得分:0)

我在您的问题中注意到,即使应用关闭,您也希望从服务器向用户发送通知,例如whats-app,Facebook等。 您是否了解了 Firebase云消息传递(FCM) Google云消息传递(GCM),我认为这更适合您的问题。点击Here了解详情。

答案 1 :(得分:0)

  1. AlarmManager设置为在预定日期\时间开火。

  2. 当它激活时,您的代码将会运行,所以只需重复步骤1即可设置下次您需要触发的功能,然后执行您需要的任何功能以检查您的站点(启动一项服务此)

  3. 从第2步开始重复

  4. 请不要忘记,重启设备后警报无法生效,因此如果设备重新启动,您需要重新设置警报。

答案 2 :(得分:0)

好吧,如果用户杀死你的应用程序,那么它取决于manofacturer。有些人只杀死进程,有些人会杀死进程以及与进程相关的服务,广播,报警管理器等。

也许GCM可以在这个杀戮过程中幸存下来,就像你说whatsapp确实收到了通知......