7

假設我想要實現一個將服務暴露給其他應用程序的應用程序(如Google Play Services ..)。如何永久保存另一個應用程序提供的PendingIntent

潛在的應用程序將註冊我與我的服務相關的特殊事件,並會在適當的時間收到通知。

我想實現這個酷似谷歌沒有與谷歌Play服務:

得益於Android的進程間通信,其他應用程序可以綁定到我的應用程序Service,並且由 - 傳遞給我的應用程序PendingIntent 「回調」,我可以在正確的時間爲他們執行。

現在,我會得到這個問題:

  • 我的應用程序正在運行(背景)的控股參考PendingIntent由其他應用程序提供。

  • 現在,由於某種原因(系統決策/用戶明確)我的過程已停止。

  • 我的過程卡明早在一些點,在該點回來「做的事情。」

- 我失去了參考之前提供給我的PendingIntent,和我不沒有看到API中的任何方式來檢索對它的引用。

我也看不出有什麼辦法來挽救持續(數據庫/ sharedPreferences /文件系統)保存掛起的意圖爲後者的使用情況

我的問題是:

  • 是有可能以某種方式持續存儲待定意圖?

  • 是否有可能「取回」引用到我已經有的相同的未決意圖?

  • 如果沒有,有沒有其他建議可以實施我描述的這種東西?

+0

是有可能看到我的回答 –

回答

4

是可以存儲持久莫名其妙未決意圖是什麼?

是有可能「重回」參照同懸而未決的意圖我已經有過嗎?

不是從操作系統。如果您有其他「引導」通信方法,則可以要求原始應用重新提供PendingIntent。例如,您可以發送廣播,聲明您需要重新註冊應用程序;使用你的服務的應用程序會聽這樣的廣播,並給你一個新的PendingIntent

或者,完全跳過PendingIntent並使用別的東西。例如,應用程序可以導出BroadcastReceiver。如果他們在當前的計劃中註冊PendingIntent,他們只會爲您提供的ComponentName。該信息(包名稱和類別名稱)可以保留,然後您可以根據需要向該特定的ComponentName發送廣播。

請注意,對於任何涉及持久性的策略,您都需要處理客戶端應用程序已升級並且舊存儲的詳細信息現在不正確的情況(例如,它們重構了其代碼,並且現在舊的ComponentName無效)。

+0

我想到這個問題的解決方案,但他們的痛苦形成了兩個主要問題:(1)我想作出避免我用複雜的API來處理客戶生活需要處理重新註冊。 (2)如果我讓我的客戶直接註冊到我的廣播,那麼他們將可以訪問操作名稱和類型,並由此 - 將這些信息「傳播」給其他人,並且我將失去控制誰可以得到這個廣播 –

+0

@TalKanel:然後跳過PendingIntent並使用別的東西。 – CommonsWare

+0

@TalKanel,您仍然可以控制誰可以通過將其廣播到已正確註冊到您的服務的特定ComponentName來獲得此廣播。這樣您就可以管理配額並將您的廣播僅限於您的服務批准的廣播。 – MikeL

0

我說是的,可以節省掛起的意圖使用正確的時間,但沒有像往常那樣有可能性的東西已經發生了未決的意圖也許去除,從而未決意圖另一個應用是沒有更多的有用......但是如果掛起的意圖沒有被破壞,那麼你將它保存爲一個正確的time.And火未決的意圖和往常一樣..

CODE:

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

希望這會幫助別人

+0

與AlramManger保存待定意圖仍然不是持久的。在一分鐘內操作系統將會關閉/重啓,那麼這個待處理的意圖參考也將從報警管理器中丟失。 –

+0

我完全同意你的看法,但這只是這樣做的一種方式......也許即將推出的api提供了更好的方式來處理這種情況......並且還有可能性被銷燬pendingintent將在系統重新啓動後重新創建.. 。 –