チェックウィジェットはAndroid画面に配置されています
-
27-10-2019 - |
質問
誰かが私のウィジェットがホーム画面に配置されていることを確認する方法を教えてもらえますか?
アプリには、ホーム画面にウィジェットが配置されている場合にのみ実行する必要があるコードがあります。
解決
その情報を自分で保存する必要があります。私は通常、アプリケーションの設定を使用しますが、何でも使用できます。通常、ウィジェットはサービスを使用して通信するため、スタッフを行うコードはサービスに含まれる可能性がありますが、設定を使用すると、アプリの任意の部分がこれにアクセスできます。
AppWidgetProviderを拡張するウィジェットクラスでは、ウィジェットがホーム画面に置かれたときにONENABLEDが呼び出され、削除されたときに(通常)削除されたときに呼び出されます。すべてのコピーが削除されたときに、障害者が呼び出されます。
したがって、ウィジェットプロバイダーのコードで:
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
setWidgetActive(true);
context.startService(new Intent(appContext, WidgetUpdateService.class));
}
@Override
public void onDisabled(Context context) {
Context appContext = context.getApplicationContext();
setWidgetActive(false);
context.stopService(new Intent(appContext, WidgetUpdateService.class));
super.onDisabled(context);
}
private void setWidgetActive(boolean active){
Context appContext = context.getApplicationContext();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean(Constants.WIDGET_ACTIVE, active);
edit.commit();
}
コードの他の場所では、ウィジェットがアクティブであるかどうかを確認します。
public boolean isWidgetActive(Context context){
Context appContext = context.getApplicationContext();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
return prefs.getBoolean(Constants.WIDGET_ACTIVE, false);
}
他のヒント
ただ言っているだけですが...
int ids[] = AppWidgetManager.getInstance(this).getAppWidgetIds(new ComponentName(this,MyAppWidgetProvider.class));
Toast.makeText(this, "Number of widgets: "+ids.length, Toast.LENGTH_LONG).show();
私はそれが古い質問であることを知っていますが、今日これを見ると、 @larsona1からの受け入れられた答えにいくつかの問題があることがわかりました。
- ユーザーが共有設定をクリアした場合 - まだウィジェットがありますが、アプリはそれについて知りません。
- ユーザーが「ウィジェットを追加」と「OK」を押す前に後悔する場合、とにかくOnEclabledが呼び出され、ウィジェットがなくてもウィジェットがホーム画面に登録され、後で削除する方法はありません。 (ADTホームランチャーのバグかもしれません)。
最初の問題の解決策を見つけました。とにかく信頼できないため、共有設定はまったく必要ありません。ランタイムで確認する必要があります。
// in some class you define a static variable, say in S.java
static boolean sWidgetMayExist = true;
ウィジェットプロバイダーで:
// MyAppWidgetProvider.java
// to respond to runtime changes, when widgets are added and removed
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
S.sWidgetMayExist = true;
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
S.sWidgetMayExist = true;
}
そして、あなたのサービスコードでこれを追加します:
AppWidgetManager manager = null;
RemoteViews views = null;
ComponentName widgetComponent = null;
// ..and in your update thread
if (!S.sWidgetMayExist) { return; }
if (manager == null || widgetComponent == null) {
widgetComponent = new ComponentName(c,
MyAppWidgetProvider.class);
manager = AppWidgetManager.getInstance(c);
}
if (manager.getAppWidgetIds(widgetComponent) == null) {
S.sWidgetMayExist = false;
}
@waza_beは、「appwidgetids」リストを見て、アクティブウィジェットの数(ホーム画面にインストールされているもの)の数を知ることが正しいことです。この情報を知る正しい方法です。
ただし、自分でこれを見る必要はないことに留意してください。
ウィジェットに関するベストプラクティスについては、公式のAndroidドキュメントを確認してください。https://developer.android.com/guide/topics/appwidgets/index.html#appwidgetprovider
正しいアプローチは、OnUpDate()メソッドのみをオーバーライドし、「アクティブ」ウィジェットのリストを繰り返すことです。
public class ExampleAppWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(context, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener
// to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
また、独自のウィジェットプロバイダーがAppWidgetProviderをオーバーライドすると、ホーム画面にウィジェットがアクティブでない場合、OnUpDate()メソッドには触れません。
「appwidgetids.length> 0」を既にチェックしているAndroid appwidgetProviderのonreceive()コードを参照してください。
public void onReceive(Context context, Intent intent) {
// Protect against rogue update broadcasts (not really a security issue,
// just filter bad broacasts out so subclasses are less likely to crash).
String action = intent.getAction();
if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
Bundle extras = intent.getExtras();
if (extras != null) {
int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
if (appWidgetIds != null && appWidgetIds.length > 0) {
this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
}
}
}
(...)
}