1

ACTION_SEND インテントを処理するメイン アクティビティ。インテント テキスト内の受信データに基づいて、データベースに新しいレコードを配置しました。私の問題は、アンドロイドが方向の変更後もこの意図を保持しているように見えるため、電話を回転させるたびにDBに1行追加されることです。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.db_list);

    Intent intent = getIntent();
    String action = intent.getAction();
    String type = intent.getType();

    if (Intent.ACTION_SEND.equals(action) && type != null) {
        if ("text/plain".equals(type)) {
            storeTextInDatabase(intent);
        }
    }

    fillListFromDB();
    registerForContextMenu(getListView());

} 

新しく受信したインテントごとに、storeTextInDatabase(intent) 呼び出しを 1 回だけ実行するにはどうすればよいですか。私の最初のアイデアは、savedInstanceState バンドルの内容が null である場合、それが Activity の最初の呼び出しであることを調べることでした。このソリューションには問題があります。アクティビティの有効期間中にブロードキャストされた複数のインテントを処理したいのです。

4

3 に答える 3

3

インテントを処理してから、処理した余分なものを削除してみてください。

インテント.removeExtra(インテント.EXTRA_TEXT);

わたしにはできる。2.3 タフでのみテストされています。

于 2013-10-28T22:05:44.630 に答える
2

いろいろ試しました。それらのほとんどは失敗でした:

  • インテントの処理後に setIntent(null) を呼び出しても機能しませんでした。オリエンテーションの変更後、どういうわけか元の意図が戻ってきました。
  • インテントのバンドルに余分な値を設定しました。ここでも同じ問題。
  • Activity の onNewIntent() メソッドを試してみました。それは私を呼んだことはありません。

1つのことがうまくいっているようです。onSavedInstance を使用して、アプリケーション状態バンドルの変数を設定します。向きが変わっても保持されますが、新しいインテントを処理するときには設定されません。

private static final String KEY_INTENT_PROCESSED = "intent processed";

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.db_list);

    Intent intent = getIntent();
    String action = intent.getAction();
    String type = intent.getType();

    boolean alreadyProcessed = savedInstanceState == null ? false : savedInstanceState.getBoolean(KEY_INTENT_PROCESSED);

    if (Intent.ACTION_SEND.equals(action) && type != null 
            && !alreadyProcessed) {            
        if ("text/plain".equals(type)) {
            storeTextInDatabase(intent);
        }
    }

    fillListFromDB();
    registerForContextMenu(getListView());

} 

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable(KEY_INTENT_PROCESSED, true);
}
于 2013-10-18T12:32:55.863 に答える
0

マニフェスト ファイルでは、向きを変更するための onCreate アクションをスキップできます。向きを変更しても、新しいインスタンスは作成されません。それを追加したくない場合は、状態も保持し、 oncreate で同じデータを処理しないように確認できます。最後に保存されたデータ識別子の SharedPreferences に保存し、同じものを処理していないことを確認してください。

<activity
        android:name="com.microsoft.adal.LoginActivity"
        android:configChanges="orientation"
        android:label="@string/title_activity_login" >
    </activity>
于 2013-10-17T19:58:37.690 に答える