【问题标题】:Keep alarmmanager when app gets closed应用程序关闭时保留警报管理器
【发布时间】:2017-02-24 13:33:24
【问题描述】:

好吧,我已经搜索了大约 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"));
}

通知发布者

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);
    }
}}

更新: 用于设置闹钟的代码... 报警管理器:

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)上测试了该应用程序,令人惊讶的是,在应用程序关闭后仍然设置了闹钟。那么,这可能与我的手机有关(Lenovo K5 A6020l36,Android 5.1.1)吗?但是在这种情况下,whatsapp 和 gmail 是如何在应用关闭的情况下仍然在这款手机上运行警报的?

【问题讨论】:

    标签: android service broadcastreceiver alarmmanager taskmanager


    【解决方案1】:

    我在您的问题中注意到,即使应用程序关闭,您也希望从服务器向您的用户发送通知,例如 whats-app、Facebook 等。 您是否阅读过 Firebase Cloud Messaging (FCM)Google Cloud Messaging (GCM),我认为这更适合您的问题。点击Here了解更多。

    【讨论】:

    • 好吧,也许我没有如我所愿地表达自己...不需要来自服务器的通知,只是一个推送通知...抱歉。
    【解决方案2】:
    1. 设置您的 AlarmManager 在您预定的日期\时间触发。

    2. 当它触发时,您的代码将运行,因此只需重复步骤 1 以设置您希望它下次触发的时间,然后执行您需要的任何功能以检查您的站点(启动一个服务这个)

    3. 从第 2 步开始重复

    不要忘记,设备重启后警报不会继续存在,因此如果设备重启,您需要重新设置。

    【讨论】:

    • 我也这样做了...但是一旦我关闭应用程序(例如,将其从“任务切换器”滑开),所有的 AlarmManager 都会被取消...:(
    • 我不知道 AlarmManager 的任何功能会在任务退出时自动取消警报,这在我设置的任何警报中从未发生过。您需要发布警报代码,因为您发布的代码似乎都与您的问题无关。
    • 好的,把代码放在更新上(顺便,谢谢关注!)
    【解决方案3】:

    好吧,如果用户终止了您的应用程序,那么这取决于制造商。有些只杀死进程,有些杀死进程以及与进程相关的服务、广播、警报管理器(等)。

    也许 GCM 可以在这个终止过程中幸存下来,正如你所说,whatsapp 确实收到了它的通知......

    【讨论】:

      猜你喜欢
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      相关资源
      最近更新 更多