如何持久保存另一个应用程序提供的PendingIntent

时间:2014-01-12 20:31:38

标签: android android-pendingintent inter-process-communicat

假设我想要实现一个将服务公开给其他应用(例如Google Play服务......)的应用。

潜在的应用会注册到我的服务相关的特殊事件,并会在合适的时间通知。

我正在考虑像Google使用Google Play服务那样实现这一点:

感谢Android进程间通信,其他应用可以绑定到我的应用Service,然后传递给我的应用PendingIntent“回调”,我可以在适当的时间为他们执行。

现在,我会遇到问题:

  • 我的应用进程当前正在运行(在后台)并持有对其他应用提供的PendingIntent的引用。

  • 现在,由于某些原因(系统决策/用户明确),我的流程已停止。

  • 我的过程在某些时候回来了,然后回到“做它的事情......”

在那一点上 - 我失去了之前提供给我的PendingIntent的引用,我在API中没有看到任何方法来检索对它的引用。

我也没有看到任何保存持久性的方法(数据库/ sharedPreferences /文件系统)保存后者的使用挂起意图

我的问题是:

  • 是否有可能以某种方式持久存储待处理的意图?

  • 是否可以“取回”对我之前已经获得的相同待定意图的引用?

  • 如果没有,是否还有其他建议来实施我所描述的内容?

2 个答案:

答案 0 :(得分:4)

  

是否有可能以某种方式持久存储未决意图?

没有

  

是否可以“取回”对我之前已经获得的相同待处理意图的引用?

不是来自操作系统。如果您有其他“引导”通信方法,您可以要求原始应用重新提供PendingIntent。例如,您可以发送一个广播,说明您需要重新注册的应用程序;使用您服务的应用会收听此类广播并为您提供新的PendingIntent

或者,完全跳过PendingIntent并使用其他内容。例如,应用可以导出BroadcastReceiver。如果他们在您当前的计划中注册PendingIntent,他们只会向您提供ComponentName的{​​{1}}。该信息(包名和类名)可以保留,然后您可以根据需要向该特定BroadcastReceiver发送广播。

请注意,对于涉及持久性的任何策略,您将需要处理客户端应用程序已升级且旧存储的详细信息现在不正确的情况(例如,他们重构了他们的代码,以及旧的{{1}现在无效)。

答案 1 :(得分:0)

我说是,可以保存使用正确时间的未决意图但不像通常那样可能已经发生了未决意图或其他应用程序已被删除,因此待处理意图不再有用...但是如果待定意图没有被销毁,那么你将它保存一段合适的时间。并像往常一样点火等待......

代码:

public void savePendingIntent(Context context,PendingIntent pendingIntentYouWantToSave)
{
    int YEAR=2015;
    int MONTH=10; //remember month start from 0
    int DATE=25;
    int HOUR=12;
    int MINUTE=10;
    int SECOND=0;
    Calendar righttime = Calendar.getInstance();
    righttime.setTimeInMillis(System.currentTimeMillis());
    righttime.set(YEAR, MONTH,DATE, HOUR, MINUTE, SECOND);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmBroadcastReceiver.class);
    intent.putExtra("SAVED_PI", pendingIntentYouWantToSave);
    PendingIntent pi = PendingIntent.getBroadcast(context, 123, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager.set(AlarmManager.RTC_WAKEUP, righttime.getTimeInMillis(),pi);
}

这里是AlarmBroadcastReceiver

public class AlarmBroadcastReceiver extends BroadcastReceiver 
{    
     @Override
     public void onReceive(Context context, Intent intent) 
     {   //your saved pending intent
         PendingIntent  SAVED_PI = (PendingIntent) intent.getParcelableExtra("SAVED_PI");
        //Fire it if need or save it again for later use
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        try {
            SAVED_PI.send(context, 0, intent);
        } catch (PendingIntent.CanceledException e) {
            Log.d("ERROR_ON_FIRE", "ERROR_ON_FIRE");
        }
     }
}

希望这会有所帮助