0

重複の可能性:
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);

常に「エクレア」だと思っているため、Froyo で失敗します。これが最善のアプローチですか、それともアプリケーション レベルを確認する必要がありますか? 私はクラスの存在を扱うことを好みます。

4

1 に答える 1

3

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

そのクラスはプロジェクトにないため、機能しません。せいぜい、デバイス上の他のプロジェクトにある可能性があります。

IntentAndroid SDK で目覚まし時計を起動するための文書化されたサポートはありません。あなたが発見しているように、パッケージ名とクラス名に配線するというあなたのアプローチは壊れやすいです。そのアプリケーションがない場合、一部のデバイスでは機能しません (たとえば、デバイスの製造元から提供されたものに置き換えられます)。さらに、これまで見てきたように、Android の将来のバージョンでは変更される可能性があります。私はデバイス メーカーに SDK を壊さないよう説得するのに十分な時間を費やしています。サードパーティの開発者にそれをさせると、私の主張が弱まります

そうは言っても、何かが an に応答するかどうかを確認する一般的な方法は(例: )Intentを使用することです。PackageManagerqueryIntentActivities()

于 2010-08-11T22:44:43.660 に答える