代码之家  ›  专栏  ›  技术社区  ›  Peter Ambruzs

由于方向改变而进行的多次意图处理

  •  1
  • Peter Ambruzs  · 技术社区  · 11 年前

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

    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(意向)调用。 我的第一个想法是,我将检查savedInstanceState捆绑包的内容,如果它为null,那么它就是活动的第一个调用。这个解决方案有一个问题,我想在我的活动寿命内处理多个广播的意图。

    3 回复  |  直到 11 年前
        1
  •  3
  •   marcopar    11 年前

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

    intent.removeExtra(intent.EXTRA_TEXT);

    它对我有效。 仅在2.3硬度上进行测试。

        2
  •  2
  •   Peter Ambruzs    11 年前

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

    • 在对意向进行处理后调用setIntent(null)无效。不知怎的,在方向改变后,最初的意图又回来了。
    • 我在意向的捆绑包中设置了一个额外的值。这里也有同样的问题。
    • 我尝试了“活动”的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);
    }
    
        3
  •  0
  •   Omer Cansizoglu    11 年前

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

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