6

問題は、組み込みのタスク マネージャーのクリーン メモリ/RAM を使用した後、ウィジェットが動作しなくなることです。これは、タスク マネージャーの RAM のクリーニング方法に関連していると思います。多くの調査といくつかの試行の後、必要であることがわかりました。パッケージの変更と更新をリッスンするBroadcastReciever:実装しましたが、ドキュメントにthat the 再起動/クリアと記載されているため機能しません package does not receive this broadcast

マニフェスト ファイルに受信者を登録します。

<receiver android:name="com.app.lab.receiver.onRestartReciever">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REPLACED" />
        <action android:name="android.intent.action.PACKAGE_RESTARTED" />
         <action android:name="android.intent.action.PACKAGE_DATA_CLEARED"/>
        <data android:scheme="package"  />
    </intent-filter>

PACKAGE_REPLACED - 特に、アプリケーションの更新を通知するために呼び出されます。

PACKAGE_RESTARTED - ほとんどのメモリ クリーナーがメモリをクリーニングしているときに呼び出されます。

「データ」行は、特定のパッケージに適用されるアクションを監視するために使用されます。

public class onRestartReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.d("DEBUG", "onRestartReciever");//I am not getting this log on clearing memory from task manager



}
}

ダミー サービスを使用してライフサイクルを取得しようとしました。つまり、onDestroy がいつ呼び出されるかを確認しましたが、信頼できる方法ではないことがわかりました。アプリケーションがタスク マネージャーによって強制終了されたときに onDestroy が呼び出されない可能性があります。

最後に、私の質問: タスク マネージャーまたは OS がメモリを消去するときに、Android システムに appWidgets を再起動するように指示する方法はありますか

ノート: My widget contains only one button that launches an Activity.It works most of the time but stops responding if OS itself cleans memory or user forcefully do it from task manager.I've downloaded some of the widget it seem to continue working fine after cleaning memory also.

更新: 私の問題の下では、完全なコードを実行する必要はありません。これは単純な Application です。私のアプリケーションにはアクティビティやサービスが含まれていません。トースト メッセージを表示する 1 つのボタンを備えたウィジェットのみが含まれています。

 public class WidgetProvider extends AppWidgetProvider {

private RemoteViews remoteViews;
private ComponentName watchWidget;
PendingIntent pi;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
    remoteViews = new RemoteViews(context.getPackageName(),
            R.layout.touchwidget);
   Intent toggleClickPlayer = new Intent(context.getApplicationContext() ,WidgetProvider.class);
    toggleClickPlayer.setAction("PLAYER");
    PendingIntent toggleIntentPlayer = PendingIntent.getBroadcast(context,0, toggleClickPlayer,endingIntent.FLAG_CANCEL_CURRENT);
    remoteViews.setOnClickPendingIntent(R.id.player, toggleIntentPlayer);
    appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    watchWidget = new ComponentName(context,WidgetProvider.class);
    remoteViews = new RemoteViews(context.getPackageName(),R.layout.touchwidget);
Toast.makeText(context, " Player started",Toast.LENGTH_SHORT).show();
(AppWidgetManager.getInstance(context)).updateAppWidget(watchWidget, remoteViews);
        }
    } 
 }
4

1 に答える 1