Как один запуск 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);

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

1 ответ

Решение

if (Class.forName("com.android.deskclock.AlarmClock")!= null)

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

Там нет документально подтвержденных Intent для запуска будильника в Android SDK. Как вы обнаруживаете, ваш подход к подключению имен пакетов и классов хрупок. Это не будет работать на некоторых устройствах, если у них нет этого приложения (например, заменено на одно от производителя устройства). Плюс, как вы видели, в будущих версиях Android это может измениться. Я достаточно грубо пытаюсь убедить производителей устройств не ломать SDK; если сторонние разработчики сделают это, это ослабит мой интерес.

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

Другие вопросы по тегам