1

我的主要活动处理 ACTION_SEND 意图。我根据意图文本中接收到的数据在数据库中添加了一条新记录。我的问题是,android 在方向改变后显然保留了这个意图,所以每次我旋转手机时,我的数据库中都会多出一行。

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) 。我的第一个想法是,我将检查 savedInstanceState 包的内容,如果它为空,那么它是 Activity 的第一次调用。这个解决方案有一个问题,我想处理在我的 Activity 生命周期内广播的多个意图。

4

3 回答 3

3

尝试处理 Intent,然后删除刚刚处理的额外内容,即:

意图.removeExtra(意图.EXTRA_TEXT);

这个对我有用。仅在 2.3 上测试过。

于 2013-10-28T22:05:44.630 回答
2

我尝试了很多东西。他们中的大多数是失败的:

  • 处理意图后调用 setIntent(null) 不起作用。不知何故,最初的意图在方向改变后又回来了。
  • 我在意图包中设置了一个额外的值。这里同样的问题。
  • 我尝试了 Activity 的 onNewIntent() 方法。它从来没有召唤过我。

一件事似乎在徘徊。我使用 onSavedInstance 设置应用程序状态包的变量。它在方向更改之间保留,但在我处理新 Intent 时未设置。

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 回答