MainActivity 在新的 Activity 开始时销毁?
MainActivity destroyed on start of a new Activity?
我有一个 Activity,其中有一个 ListView 作为主要 Activity。选择列表中的一项后,它会启动一个新的 activity,显示有关所选列表中的项目的详细信息。代码运行正常,相关详情如下:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("test","test");
ListView listView=(ListView) findViewById(R.id.name_list);
ListAdapter adapter=new SimpleAdapter(this,contactList,
R.layout.list_item,new String[]{TAGS[2]},new int[]{R.id.list_name_display});
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
Intent intent=new Intent(MainActivity.this,SingleContactActivity.class);
intent.putExtra(EXTRA_CONTACT_POSITION,position);
startActivity(intent);
}
});
}
新创建的 activity 有主 activity 作为它的父级,所以当我看完它时,我按操作栏上的向上按钮到 return 到列表视图。但是Log.d(...)
行告诉我,每次去详细信息activity,然后return到主activity,主activity是重新创建。
我不想要这个和我读这个的方式:https://developer.android.com/training/basics/activity-lifecycle/stopping.html 是主 activity 应该在新的启动时停止,然后启动,然后在向上按钮按下。有人知道我的主 activity 被破坏的原因吗?
感谢您的帮助
编辑:
清单文件
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SingleContactActivity"
android:label="@string/title_activity_single_contact"
android:parentActivityName=".MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.jefe.jefecontacts.MainActivity" />
</activity>
</application>
I don't want this . . .
太糟糕了。这就是它的工作原理,您对此无能为力。
请注意,这并不总是会发生。但它 可能 总是发生,你必须编写你的应用程序,以便可以对用户透明地销毁和重新创建它的所有活动。这正是 "don't keep activities" 开发者选项的用途。一个行为良好的应用程序将在打开该选项的情况下完美运行。
在 device/emulator 中检查您的开发者选项。具体检查 "Don’t keep activities" 是否未选中。
注意:您不能总是保证父 activity 不会被销毁。如果系统 运行 内存不足,OS 可能会杀死父 activity。您应该为此做好准备,并在启动 SingleContactActivity 之前将所有必要的数据保存在父 activity 中。
hmm.. 你可以做的是,在新的 activity 中显示信息 not,but 使用而是一个对话框。这样您的 activity 就会保持活动状态,因此不会被重新创建。
如果你想要全屏,你可以使用:MyDialog = new Dialog(mContext, android.R.style.Theme_NoTitleBar_Fullscreen);
使用您自己的布局:MyDialog.setContentView(R.layout.myLayout);
添加按钮(如后退按钮):final Button myBackButton = (Button)MyDialog.findViewById(R.id.my_back_button);
并使用它们:
myBackButton.setOnClickListenernew View.OnClickListener() {
@Override
public void onClick(View v) {
MyDialog.dismiss();
}
});
或覆盖键:
MyDialog.setOnKeyListener(new Dialog.OnKeyListener() {
@Override
public boolean onKey(DialogInterface arg0, int keyCode,
KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) { //Back key pressed
MyDialog.dismiss();
}
return true;
}
});
希望这对您有所帮助 ;)
我有一个 Activity,其中有一个 ListView 作为主要 Activity。选择列表中的一项后,它会启动一个新的 activity,显示有关所选列表中的项目的详细信息。代码运行正常,相关详情如下:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("test","test");
ListView listView=(ListView) findViewById(R.id.name_list);
ListAdapter adapter=new SimpleAdapter(this,contactList,
R.layout.list_item,new String[]{TAGS[2]},new int[]{R.id.list_name_display});
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
Intent intent=new Intent(MainActivity.this,SingleContactActivity.class);
intent.putExtra(EXTRA_CONTACT_POSITION,position);
startActivity(intent);
}
});
}
新创建的 activity 有主 activity 作为它的父级,所以当我看完它时,我按操作栏上的向上按钮到 return 到列表视图。但是Log.d(...)
行告诉我,每次去详细信息activity,然后return到主activity,主activity是重新创建。
我不想要这个和我读这个的方式:https://developer.android.com/training/basics/activity-lifecycle/stopping.html 是主 activity 应该在新的启动时停止,然后启动,然后在向上按钮按下。有人知道我的主 activity 被破坏的原因吗?
感谢您的帮助
编辑: 清单文件
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SingleContactActivity"
android:label="@string/title_activity_single_contact"
android:parentActivityName=".MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.jefe.jefecontacts.MainActivity" />
</activity>
</application>
I don't want this . . .
太糟糕了。这就是它的工作原理,您对此无能为力。
请注意,这并不总是会发生。但它 可能 总是发生,你必须编写你的应用程序,以便可以对用户透明地销毁和重新创建它的所有活动。这正是 "don't keep activities" 开发者选项的用途。一个行为良好的应用程序将在打开该选项的情况下完美运行。
在 device/emulator 中检查您的开发者选项。具体检查 "Don’t keep activities" 是否未选中。
注意:您不能总是保证父 activity 不会被销毁。如果系统 运行 内存不足,OS 可能会杀死父 activity。您应该为此做好准备,并在启动 SingleContactActivity 之前将所有必要的数据保存在父 activity 中。
hmm.. 你可以做的是,在新的 activity 中显示信息 not,but 使用而是一个对话框。这样您的 activity 就会保持活动状态,因此不会被重新创建。
如果你想要全屏,你可以使用:MyDialog = new Dialog(mContext, android.R.style.Theme_NoTitleBar_Fullscreen);
使用您自己的布局:MyDialog.setContentView(R.layout.myLayout);
添加按钮(如后退按钮):final Button myBackButton = (Button)MyDialog.findViewById(R.id.my_back_button);
并使用它们:
myBackButton.setOnClickListenernew View.OnClickListener() {
@Override
public void onClick(View v) {
MyDialog.dismiss();
}
});
或覆盖键:
MyDialog.setOnKeyListener(new Dialog.OnKeyListener() {
@Override
public boolean onKey(DialogInterface arg0, int keyCode,
KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) { //Back key pressed
MyDialog.dismiss();
}
return true;
}
});
希望这对您有所帮助 ;)