9

同僚!私の問題は次のとおりです。構成アクティビティ(最小SDK-2.1)を備えたアプリウィジェットがあります。正常に動作しますが、動作が遅くなることがあります。ログに記録したところ、アプリウィジェットメソッドを更新する前に、onUpdateが一連のアプリウィジェットIDを受け取っていることがわかりました。

  @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        Log.d("onUpdate", Arrays.toString(appWidgetIds));

しかし、実際には、ホーム画面にApp Widgetのインスタンスは2つしかありませんでしたが、配列の長さは2(2)を超えています。4、場合によっては5または6です。どうしてそうなるのでしょうか。AppWidgetの更新が遅い理由は、すべてのIDに対してonUpdate-methodを呼び出さなければならないためですが、一部のID(「ファントムウィジェット」と呼ばれる)は実際には正しくありません。

たぶん、誰かがそのような問題に遭遇し、実際のアプリウィジェットIDのみを処理する方法を理解するのを手伝ってくれるでしょう。

PSアプリウィジェットをアンインストールしてから再インストールすると(その後、すべてのゴーストウィジェットが消えてしまいます)、私の問題を適切に解決することはできません。ゴーストと実際のウィジェットをプログラムで制御したいと思います。

誰かがこのバグを修正する方法を知っていますか?

4

3 に答える 3

4

このコードはウィジェット(画面上のウィジェットも含むすべて)を削除するため、理想的なソリューションではありません

ComponentName cn = new ComponentName(getApplicationContext(), YourWidget.class);
AppWidgetManager appWidgetManager =  AppWidgetManager.getInstance(getApplicationContext());
int[] appWidgetIds1 = appWidgetManager.getAppWidgetIds(cn);
AppWidgetHost host = new AppWidgetHost(getApplicationContext(), 0);
for (int appWidgetId : appWidgetIds1) {
    host.deleteAppWidgetId(appWidgetId);
}

4.2でのロック画面ウィジェットの削除でまだ問題があります(onReceiveは呼び出されません)

于 2012-12-03T19:03:11.073 に答える
3

わかりました。ウェブで少し検索したところ、これはAndroid全体のバグのようで、現在は修正されていないことがわかりました。可能であれば、キャッシュをクリアしてみてください。[設定]->[アプリケーション]->[アプリケーションの管理]に移動します。次に、ホームランチャーアプリケーションに移動し、キャッシュをクリアします。次に、アプリをもう一度起動して、古いアプリウィジェットがまだあるかどうかを確認してください。私はこれについてウェブ上でいくつか興味深いものを見つけました:

http://forum.xda-developers.com/showthread.php?t=1030804

http://eagle.phys.utk.edu/guidry/android/appWidget.html

これでさえ、Android開発者のページとグループ投稿で議論されています:

http://developer.android.com/guide/topics/appwidgets/index.html#AppWidgetProvider

https://groups.google.com/forum/?fromgroups=#!msg/android-developers/Nl0e06rDCRY/4nAh3xnKBeQJ

彼らは1.5の問題について話しますが、それはより高いシステムでも問題だと思います。グループ投稿には、これを修正する方法の例があります。

      @Override
        public void onReceive(Context context, Intent intent) {
         final String action = intent.getAction();
         if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
         final int appWidgetId = extras.getInt
       (AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);
       if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
        this.onDeleted(context, new int[] { appWidgetId });
          }
       } else {
          super.onReceive(context, intent);
       }
      } 

ユーザーがアプリを削除したり、ホーム画面からウィジェットを置き換えたりしても、すべてのアプリウィジェットが自動的に削除されるわけではないようです。これが正しい方向である場合は、フィードバックをお願いします。はいの場合、この問題に対して別のアプローチが必要です。私にとっても興味深いですが、現時点では、ここで確認できるラップトップはありません。ありがとう

于 2012-11-21T11:39:43.437 に答える
0

数か月前に書いたアプリでも同じ問題が発生しました。私の場合は問題ではありません。「ファントムウィジェット」を削除する方法のチュートリアルを見つけました。テストしたことはありません。試してみてください。

http://blog.fiziksphreak.com/2011/07/28/remove-phantom-widgets-in-android/

しかし、これがアプリの速度を低下させていることは確かですか?これがリソースに高額になるとは想像できませんか?

編集

古いアプリを強制終了する代わりに、これは役立つ可能性があります。

    Bundle extras = intent.getExtras();
     int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);

また

    Bundle extras = intent.getExtras();
     int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);

これがあなたが探しているものかどうかはわかりません。

于 2012-11-20T12:42:58.823 に答える