2010-08-11 50 views
0

可能重複:
Intent to launch the clock application on android如何啓動android版本依賴鬧鐘?

我有一個顯示的時間,如果一個就可以了水龍頭,其與PendingIntent啓動com.android.alarmclock/.AlarmClock活動部件。這在Froyo之前效果很好,但使用Froyo時,我必須啓動com.android.deskclock/.AlarmClock。所以我想要加入代碼來檢查班級是否存在並啓動適當的活動/意圖。這是我試過的,但它不起作用。

Intent alarmIntent = new Intent(); 
try { 
    if (Class.forName("com.android.deskclock.AlarmClock") != null) { 
    Log.i(TAG, "setting deskclock alarm -- must be Froyo!"); 
    alarmIntent.setClassName("com.android.deskclock", 
     "com.android.deskclock.AlarmClock"); 
    } 
} catch (ClassNotFoundException e) { 
    Log.i(TAG, "setting alarmclock alarm -- must be Eclair!"); 
    alarmIntent.setClassName("com.android.alarmclock", 
     "com.android.alarmclock.AlarmClock"); 
} 
PendingIntent pendingIntent = PendingIntent.getActivity(context, REQUEST_UPDATE_TIME_NOW, 
    alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
views.setOnClickPendingIntent(R.id.text_timeofday, pendingIntent); 

它總是認爲它是「Eclair」,因此在Froyo上失敗。這是最好的方法,還是應該檢查應用程序級別?我喜歡和班級生活一起工作。

+0

我的語法正確嗎? – mobibob 2010-08-11 22:41:15

回答

3

如果(以Class.forName( 「com.android.deskclock.AlarmClock」)!= NULL)

這是行不通的,因爲那類不是在您的項目。至多,它可能在設備上的其他項目中。

沒有文檔支持Intent在Android SDK中啓動鬧鐘。正如你所發現的那樣,你的包裝和類名稱中的硬連線方法是脆弱的。如果某些設備沒有該應用程序(例如,由設備製造商的設備替換),則該設備無法工作。另外,正如您所見,它可能會在未來的Android版本中發生變化。我有足夠的時間試圖說服設備製造商不要打破SDK; having third-party developers do it weakens my case

也就是說,查看某件事是否會響應Intent的一般方法是使用PackageManager(例如,queryIntentActivities())。

+0

我完全同意你對脆弱性的評估。我正準備提出運營商包裝問題。感謝您直接採用這種方法。 – mobibob 2010-08-11 22:57:12