次の AppWidgetProvider があります
public class MyWidgetProvider extends AppWidgetProvider {
public final String TAG = "WidgetExample";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.w(TAG, "onUpdate method called");
ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
Intent intent = new Intent("INIT_STATE");
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
context.sendBroadcast(intent);
}
}
そのアクションを使用するように構成された次のブロードキャストレシーバーがあります。
public class StateReceiver extends BroadcastReceiver {
public final String TAG = "WidgetExample";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "StateReceiver got " + intent.getAction());
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
ComponentName smsComp = new ComponentName(context, SmsReceiver.class);
PackageManager pm = context.getPackageManager();
if ("INIT_STATE".equals(intent.getAction())) {
// Lets check state..
int currentState = pm.getComponentEnabledSetting(smsComp);
if(currentState == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT || currentState == PackageManager.COMPONENT_ENABLED_STATE_DISABLED){
Log.d(TAG, "State is " + currentState + ", matching views to be disabled");
setViewsDisable(remoteViews);
} else {
Log.d(TAG, "State is " + currentState + ", matching views to be enabled");
setViewsEnable(remoteViews);
}
} else if ("TOGGLE_STATE".equals(intent.getAction())) {
int currentState = pm.getComponentEnabledSetting(smsComp);
Log.d(TAG, "Current state is " + currentState);
if (currentState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
disable(remoteViews, smsComp, pm);
} else {
enable(remoteViews, smsComp, pm);
}
}
int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
for (int widgetId : allWidgetIds) {
Log.d(TAG, "Setting the pending intents");
Intent clickIntent = new Intent("TOGGLE_STATE");
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.backgroundImage, pendingIntent);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
}
private void setViewsEnable(RemoteViews remoteViews) {
remoteViews.setImageViewResource(R.id.backgroundImage, R.drawable.enabledshape);
remoteViews.setTextViewText(R.id.txtStatus, "ENABLED");
}
private void setViewsDisable(RemoteViews remoteViews) {
remoteViews.setImageViewResource(R.id.backgroundImage, R.drawable.disabledshape);
remoteViews.setTextViewText(R.id.txtStatus, "DISABLED");
}
private void enable(RemoteViews remoteViews, ComponentName smsComp, PackageManager pm) {
Log.d(TAG, "enabling");
setViewsEnable(remoteViews);
pm.setComponentEnabledSetting(smsComp, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
private void disable(RemoteViews remoteViews, ComponentName smsComp, PackageManager pm) {
Log.d(TAG, "disabling");
setViewsDisable(remoteViews);
pm.setComponentEnabledSetting(smsComp, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
}
私がやりたいこと: ENABLEDまたはDISABLEDのいずれかでテキストビューを表示するシンプルなウィジェットウィジェットをクリックすると、他の状態に切り替わる必要があります状態を切り替えると、プログラムでレシーバーを有効または無効にする必要があります
現在何が起こっているか: AppWidgetProvider の onUpdate が定期的に呼び出されているようです (私が推測する Android システムによって)。ウィジェットが作成されてからのリモート ビュー。
削除ビューは非同期で更新されますか? ウィジェットが初期状態に戻らないようにするにはどうすればよいですか? これは、有効に切り替えたときにのみ問題になります。切り替え後、約 1 秒間無効に戻ります。