2010-08-11 3 views
0

Можно создать дубликат:
Intent to launch the clock application on androidКак запустить будильник, зависящий от версии Android?

У меня есть виджет, который отображает время, и если один краны на него, он запускает com.android.alarmclock/.AlarmClock деятельность с PendingIntent , Это отлично работает перед 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); 

Он всегда считает, что это «Эклер» и поэтому терпит неудачу на Фройо. Это лучший подход, или я должен проверить уровень приложения? Я предпочитаю работать с классом.

+0

Правильно ли мой синтаксис? – mobibob

ответ

3

если (Class.forName ("com.android.deskclock.AlarmClock")! = NULL)

Это не будет работать, потому что класс не в вашем проекте. В лучшем случае это может быть в каком-то другом проекте на устройстве.

Для запуска будильника в Android SDK нет документально подтвержденного Intent. Ваш подход к жесткой проводке в именах пакетов и классов является хрупким, поскольку вы обнаруживаете. Он не будет работать на некоторых устройствах, если у них нет этого приложения (например, заменено на устройство от производителя устройства). Кроме того, как вы видели, это может измениться в будущих версиях Android. У меня довольно грубое время, пытаясь убедить производителей устройств не нарушать SDK; having third-party developers do it weakens my case.

Это, как говорится, общий способ узнать, что-то ответит на вопрос Intent, - использовать PackageManager (например, queryIntentActivities()).

+0

Я полностью согласен с вашей оценкой хрупкости. Я собирался задать вопрос о упаковке перевозчиками. Спасибо, что поставил меня прямо на этот подход. – mobibob

Смежные вопросы