ウィジェットからアクティビティを起動する
-
20-09-2019 - |
質問
本当はとても簡単なはずのことをやろうとしているのですが、気が狂いそうになってしまいました。ホーム画面ウィジェットが押されたときに、ウィジェットの構成アクティビティなどのアクティビティを起動しようとしています。Android Developers Web サイトのチュートリアルを一字一句忠実に実行し、非公式チュートリアルもいくつか実行したと思いますが、動作しないため、何か重要な点が欠けていると思われます。
コードは次のとおりです。
public class VolumeChangerWidget extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
final int N = appWidgetIds.length;
for (int i=0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
Log.d("Steve", "Running for appWidgetId " + appWidgetId);
Toast.makeText(context, "Hello from onUpdate", Toast.LENGTH_SHORT);
Log.d("Steve", "After the toast line");
Intent intent = new Intent(context, WidgetTest.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
ウィジェットをホーム画面に追加すると、Logcat にはトーストではなく 2 つのデバッグ行が表示されます。(なぜそうしないのかアイデアはありますか?) しかし、さらに厄介なのは、PendingIntent が関連付けられているボタンをクリックしても、まったく何も起こらないことです。メインアクティビティ内からインテントを設定すると正常に起動するため、「WidgetTest」アクティビティが実行できることがわかりました。
重要な場合に備えて、Android マニフェスト ファイルを次に示します。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.steve"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Volume_Change_Program"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".WidgetTest"
android:label="@string/hello">
<intent_filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent_filter>
</activity>
<receiver android:name=".VolumeChangerWidget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/volume_changer_info" />
</receiver>
</application>
<uses-sdk android:minSdkVersion="3" />
どこに障害があるかをテストする方法はありますか?つまり、ボタンが PendingIntent に正しくリンクされていないこと、または PendingIntent または Intent が WidgetTest.class を見つけていないことが原因でしょうか。
ご協力いただき誠にありがとうございました!
スティーブ
解決
私は同じ問題を抱えていました。私は修正がappwidgetマネージャを介して更新を呼び出すことであることを発見しました。ここonEnabledでそれを行う方法の一例です。それはそれは、デバイスがあなたのクリックの意図に電源投入されたときにもintializedされるように、両方のonEnabledで行われ、onUpdatedする必要が表示されます - 。onUpdatedでのparamsはすでに幸いにも、マネージャへの参照を提供します。
@Override
public void onEnabled(Context context) {
//Log.v("toggle_widget","Enabled is being called");
AppWidgetManager mgr = AppWidgetManager.getInstance(context);
//retrieve a ref to the manager so we can pass a view update
Intent i = new Intent();
i.setClassName("yourdoman.yourpackage", "yourdomain.yourpackage.yourclass");
PendingIntent myPI = PendingIntent.getService(context, 0, i, 0);
//intent to start service
// Get the layout for the App Widget
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.togglelayout);
//attach the click listener for the service start command intent
views.setOnClickPendingIntent(R.id.toggleButton, myPI);
//define the componenet for self
ComponentName comp = new ComponentName(context.getPackageName(), ToggleWidget.class.getName());
//tell the manager to update all instances of the toggle widget with the click listener
mgr.updateAppWidget(comp, views);
}
他のヒント
のバック死者からこのの方法をもたらすが、私は同様の問題があったと私は最終的にはあなたのように、私はRemoteViewに添付PendingIntentを持っていた...それを解決したと思います。時にはそれがうまくいく、そして時にはそれが失敗します。それは狂気私を運転していた。
だった私は()PendingIntent.getActivty上のツールチップから見つけます:
活動は、既存の活動の文脈の外で開始されることに注意してください、あなたはテントでIntent.FLAG_ACTIVITY_NEW_TASK起動フラグを使用する必要があります。
ので、私はコメントを追加しました:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
私がこれまで見てきたんサンプルコードは、これを行いませんが、それは私の問題を解決しました。設定の活動は今、確実に起動されます。
うまく働いている完全なコード...
Intent intent = new Intent(context, Settings.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appId); // Identifies the particular widget...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Make the pending intent unique...
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.wwwidget);
views.setOnClickPendingIntent(R.id.widget, pendIntent);
appWidgetManager.updateAppWidget(appId,views);
ここの情報、単語ウィジェットのサンプル、および チュートリアルはこちら
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
// first param is app package name, second is package.class of the main activity
ComponentName cn = new ComponentName("com....","com...MainActivity");
intent.setComponent(cn);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent myPI = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_word);
views.setOnClickPendingIntent(R.id.widget, myPI);
AppWidgetManager mgr = AppWidgetManager.getInstance(context);
mgr.updateAppWidget(comp, views);
トーストが表示されていないとの問題は簡単ですが、あなたは、)(私はいつもあまりにもやる間違いをショーを呼び出すことはありません... やる
Toast.makeText(context, "Hello from onUpdate", Toast.LENGTH_SHORT).show();
の代わりに
Toast.makeText(context, "Hello from onUpdate", Toast.LENGTH_SHORT);
スティーブ、
あなたが問題を発見したことがありますか?私は、ウィジェットを使用し、それがonEnabledトリックなしで私のために正常に動作します。それはあなたのためにしない理由私が興味を持っています。
私の推測:あなたの元のコードにしてみてください。
PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, 0);
の代わりに
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
にウィジェットを追加する場合 ホームスクリーン、Logcatは2を示し ないトーストものの、ラインをデバッグします。 (任意のアイデアなぜ?)
Toasts
からBroadcastReceiver
を起動しようとしないでください。
障害テストする方法はあります ているのですか?
adb logcat
、DDMS、またはEclipseでのDDMSの視点を通じて、LogCatを見てください。あなたは、与えられたIntent
と一致する活性を見つからないという警告を見つけることができます。
私は、このスレッドは、古代のですけど、... 他の答えはあなたの焼けたトーストの問題について説明します。あなたのポップアップ活動がタッチに起動しない理由として、あなたが起動し、あなたにonUpdate()メソッドを呼び出すために「更新」アクションを有効にする必要があります。そのために私はあなたがこのような「APPWIDGET_UPDATE」アクションを追加する必要があると思う。
<activity android:name=".WidgetTest" android:label="@string/hello">
<intent_filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent_filter>
</activity>
あなたも、これらのメソッドをオーバーライドする場合は、同様にAPPWIDGET_ENABLEDとAPPWIDGET_DISABLEDアクションを追加します。
あなたが呼ばれたいオーバーライドされたメソッドを宣言する必要があります非常に珍しいAPIのようです。親のカスタムバージョンを取得する通常の方法は、単純にそれらを実装/オーバーライドすることです。たぶんそこにこの奇妙なパターンのための十分な理由だが、それは私が前に見てきたJavaのパターンではありません。従って私はアプリウィジェットの作者の多くをつまずかする可能性が高いと思います。アプリのウィジェットは、このメカニズムのない十分な混乱はなかったかのように。
1つの追加のポイント:ウィジェットから呼び出された活動は、マニフェストファイルで宣言する必要があります。何も起こらないようにスローされる例外は、ちょうど見えない...
私はちょうど私が(非常に愚かな)されているように、すべての夜、これを戦ってどこかにここにこれを注意することは望んでいました。基本的に私は正しく、すべての目的のコードをしましたが、何も発売されないであろう。
問題は、私が誤っていたということでした。このような呼び出し
super.onUpdate(context, appWidgetManager, appWidgetIds);
私のオーバーライドにonUpdate()関数の終わりに。
あなたはを作成し、それはあなたが設定したすべての保留中のインテントをクリアしますとのスーパーには、このコールを持っていない!