我的主要活动是处理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的第一次调用。这个解决方案有一个问题,我想在我的活动生命周期内处理多个广播的意图。
答案 0 :(得分:3)
尝试处理Intent,然后删除刚刚处理的额外内容,即:
intent.removeExtra(Intent.EXTRA_TEXT);
它对我有用。 仅测试2.3坚韧。
答案 1 :(得分:2)
我尝试了很多东西。他们中的大多数都是失败的:
有一件事看起来很有效。我使用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>