2010-08-11 62 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