由于方向改变而导致多重意图处

时间:2013-10-17 19:53:37

标签: android android-intent android-activity oncreate landscape-portrait

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

3 个答案:

答案 0 :(得分:3)

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

intent.removeExtra(Intent.EXTRA_TEXT);

它对我有用。 仅测试2.3坚韧。

答案 1 :(得分: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);
}

答案 2 :(得分:0)

在清单文件中,您可以跳过onCreate操作以更改方向。如果更改方向,则不会创建新实例。如果您不想添加它,您也可以保持状态并检查oncreate以不处理相同的数据。保存到SharedPreferences以获取最后保存的数据标识符,并确保您没有处理相同的事情。

<activity
        android:name="com.microsoft.adal.LoginActivity"
        android:configChanges="orientation"
        android:label="@string/title_activity_login" >
    </activity>