4

構成が変更されたとき(画面の向きなど)、および電話のロックが解除されたときに自動的に更新されるウィジェットがあります。このプロセスにはonClick、ウィジェットのボタンのハンドラーの設定が含まれます。これはうまく機能しますが、アプリがonClickイベントに応答しないという使用例があることがわかりました。この特定のケースは、ランチャーが自動的に再起動するときです。

ランチャーがいつ再起動したかを検出する方法はありますか?ウィジェットを手動で更新できますか?または、onClickハンドラーが失われないようにする別の方法はありますか?

4

2 に答える 2

10

new RemoteViews()ビューを生成するために一度呼び出すだけで、必要に応じてその1つのインスタンスを参照する必要があるときに、スパムを送信していたことがわかりました。私のソリューションでは、この単一のRemoteViewインスタンスを格納するクラス変数と、それにアクセスするためのゲッターがあります。

于 2011-07-12T15:16:23.503 に答える
0

@Glitchによる提案は、特定の場合、特に。を使用したアプリウィジェットでは機能しない場合がありますListView。これは、何度か呼び出された後ListView、非常に遅くなる(スクロールしてみてください)ためです。ListViewappWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id)

私の推測では、単一のRemoteViewインスタンスは実行されたすべての命令をリストに保持します。時間の経過とともに、命令リストは増えていきます。毎回appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id)、大きな命令リストが繰り返し実行されます。

私の提案する解決策は次のとおりです。ただし、ランチャーの再起動中にすべてのデバイスが同じブロードキャストメッセージを受信するわけではないため、特定のデバイスでのみ機能すると思います。

@SuppressLint("NewApi")
@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();

    if (action.equals("com.sec.android.widgetapp.APPWIDGET_RESIZE")) {
        // http://stackoverflow.com/questions/17396045/how-to-catch-widget-size-changes-on-devices-where-onappwidgetoptionschanged-not
        handleTouchWiz(context, intent);

        // Possible launcher restart.
        handleLauncherRestart(context, intent);
    } else if (action.equals("android.appwidget.action.APPWIDGET_UPDATE_OPTIONS")) {

        // Possible launcher restart.            
        handleLauncherRestart(context, intent);
    } 

    super.onReceive(context, intent);
}

private void handleLauncherRestart(Context context, Intent intent) {
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);
    updateAppWidget(context, appWidgetManager, appWidgetId);
}

private void handleTouchWiz(Context context, Intent intent) {
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

    int appWidgetId = intent.getIntExtra("widgetId", 0);
    int widgetSpanX = intent.getIntExtra("widgetspanx", 0);
    int widgetSpanY = intent.getIntExtra("widgetspany", 0);

    if (appWidgetId > 0 && widgetSpanX > 0 && widgetSpanY > 0) {
        Bundle newOptions = new Bundle();
        // We have to convert these numbers for future use
        // http://stackoverflow.com/questions/10008521/appwidget-size-calculation
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 74 - 2);
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 74 - 2);

        } else {
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 70 - 30);
            newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 70 - 30);
        }

        onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
    }
}
于 2014-03-22T17:29:46.963 に答える