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

假设我想实现一个应用程序,该应用程序将服务暴露给其他应用程序(如Google Play Services ..)。

潜在的应用程序将注册我与我的服务相关的特殊事件,并会在适当的时间收到通知。

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

感谢Android Inter-Process Communication,其他应用程序可以绑定到我的应用程序Service ,并通过它传递给我的应用程序PendingIntent “回调”,我可以在适当的时间为他们执行。

现在,我会解决这个问题:

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

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

  • 我的过程在某个时候回到了“回到”做它的事情..“

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

    也没有看到任何方式来持久保存(数据库/ sharedPreferences /文件系统)保存待用意图后者使用

    我的问题是:

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

  • 是否有可能“回头”引用我已经有过的相同的未决意图?

  • 如果没有,是否还有其他建议来实施我所描述的这种事情?


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

    没有。

    是否有可能“回头”引用我已经有过的相同的未决意图?

    不从操作系统。 如果您有其他“引导”通信方法,则可以要求原始应用重新提供PendingIntent 。 例如,您可以发送广播,声明您需要重新注册应用程序; 使用你的服务的应用程序会监听这样的广播并给你一个新的PendingIntent

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

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


    我说是的 ,可以保存使用正确的时间的待定意图,但不像往常一样有可能已经发生的待定意图或另一个应用程序可能被删除,所以待决意图没有用处......但是,如果待定意图没有被破坏然后你保存它在适当的时间。和火一样平常的意图..

    码:

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

    希望这会帮助某人

    链接地址: http://www.djcxy.com/p/76753.html

    上一篇: How to persistently save PendingIntent provided by another application

    下一篇: How to validate a regex with PHP