3 に答える
これは回避策であり、解決策の IMO ではありません。
問題
問題は、onCreate() と onNewIntent() が何があってもアクティビティに同じインテントを与え続けたことにあることを思い出してください (何もスティッキーではありませんでした)。Bundle savedInstanceStateが常に null だったため、最悪の攻撃者は onCreate()でした。
回避策
インテント アクションとインテント エクストラからのタイム スタンプを保持するシリアライズ可能な (lets call is sFOO) クラスを作成しました。onCreate() 中に、このシリアル化されたクラス (sFOO) をロードします。onStart() の間に、sFOO を処理中のインテントと比較します。すべてが新しい場合、インテントを処理し、sFoo を更新してから保存する必要があることはわかっています。そうでない場合は、意図を無視します。
コードが必要ですか?
onStart() で
Intent activityIntent = this.getIntent();
if (activityIntent != null)
{
if (activityIntent.getAction() != null)
{
boolean newIntent = false;
//Is the intent action being processes same as previous?
if (activityIntent.getAction().compareTo(this.mLastProcessedIntent.mLastIntentProcessedAction) == 0)
{
if (activityIntent.getExtras() != null)
{
//Is the intent time stamp being processed same as previous?
if (activityIntent.getExtras().getLong(TIME_STAMP_KEY) != this.mLastProcessedIntent.mLastIntentProcessedTimestamp)
{
newIntent = true;
}
}
}
else
{
Log.d(TAG,"Last processed intent action does not equal new one.");
newIntent = true;
}
if (newIntent)
{
updateAndSaveProcessedIntent();
/*YOUR CODE HERE TO HANDLE INTENT*/
}
}
}
私の解決策は、最初にアクティビティをに変更してから
android:launchMode="singleTop"
onNewIntentを使用することでした
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
setIntent(intent);
}
アクティビティを開始するために使用しているインテントは、「スティッキー」インテントとしてブロードキャストされた可能性があります。スティッキー インテントは、消費された後でもインテントを利用できるようにします。その場合、アプリは以前に使用されたのと同じ Intent を取得します。そのインテントをブロードキャストしているものを確認して、それがスティッキー インテントであるかどうかを確認できる場合。これはマニフェストに表示されます。
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
そして、次の方法で送信されます。
sendStickyBroadcast(intent);
それを変更する機能がない場合 (アプリが呼び出していない場合) は、アプリに適した対処方法を見つける必要があります。これは、コードを表示しない場合の 1 つの可能性にすぎません。