Activity一种可以包含用户界面的组件,用于和用户交互。
选择包new→Activity→Empty Activity,勾选Generate Layout File表示会自动为此Activity创建一个xml布局文件,勾选Launcher Activity表示会自动将此Activity设置为主活动(即进入App后的第一个界面)。通过这种方式创建的Activity会自动在Manifest.xml中注册。
Tips:
Activity通过onCreate()中的setContentView()方法,传入布局文件的id(项目中的任何资源都会在R文件中生成一个相应的资源id),以加载相应的布局。
通过手机Back按键即可销毁当前活动,在程序中可以通过调用finish()方法销毁
Android通过任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈成为返回栈(Back Stack)。每次启动一个新的Activity就会入栈位于栈顶,当按下Back键或者调用finish()方法销毁活动时,栈顶的Activity就会出栈。系统总是显示栈顶的活动给用户。
根据以上,活动又可分为3种生存期:
应避免在onPuase()中进行耗时操作,因为必需在执行完onPuase()后新的Activity才能onResume()
在应用程序进行横竖屏切换或多窗口模式时,Activity都会重新创建,如在播放视频时,应该在onstop()方法中处理暂停的逻辑,在onStart()方法恢复视频的播放。
在Mainfest.xml中的
如要禁用多窗口模式,则需要在Mainfest.xml中的
android:resizeableActivity="false"
如要禁用横竖屏切换,可在Mainfest.xml中的
android:screenOrientation="portrait"
当在MainActivity的文本框输入了一行数据,然后启动OtherActivity,此时MainActivity处于停止状态,若因系统内存不足被回收,当点击Back键返回时,MainActivity被重新创建,但刚刚在文本框的输入数据却不见了。
通过onSaveInstanceState()可以解决上述问题,onSaveInstanceState()会在onStop()之前调用,可以通过这个方法保存临时数据。
onSaveInstanceState()可通过Bundle的putXXX(String,XXX)方法已键值对的方式保存数据,其中XXX可以是基本数据类型或数组,如保存字符串:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("tempData","Data");
}
恢复数据可用onCreate()方法中的参数
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
Log.d("MainActivity", savedInstanceState.getString("tempData"));
}
}
或者onRestoreInstanceState()方法,区别在于onCreate()在正常启动时,savedInstanceState为空,故需要判空,而onRestoreInstanceState()则必定有值
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
默认模式,每次启动新Activity都会创建实例入栈
若要启动的Activity已在栈顶,则不会在创建新的实例,但会调用onNewIntent()
通常用于接收消息后显示的界面,不管接收几个消息始终为同一个Activity
如下Activity2启动ActivityY(singleTask),其所在的Task被调度到前台,随后按返回键也是也是先返回ActivityY所在Task中的Activity
为新Activity启用一个新返回栈,可用于共享Activity实例,如浏览器,若当前未打开,第一次调用则打开浏览器,后续的调用都是在已打开的浏览器中
若启动模式为singleTask或singleInstance的ActivityA,通过startActivityForResult()启动另一个ActivityB
创建BaseActivity继承AppCompatActivity,重写onCreate方法获取并打印当前实例类名:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
}
}
让其他Activity继承BaseActivity,当进入不同Activity时,会打印对应的名称。
创建ActivityCollector管理Activity,内部用List维护Activity实例,加入增删方法:
public class ActivityCollector {
public static List activities = new ArrayList<>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void delActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
android.os.Process.killProcess(android.os.Process.myPid());
}
}
修改BaseActivity,在onCreate中把当前Activity添加到List,在onDestroy中移除当前Activity:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.delActivity(this);
}
}
此外可通过ActivityCollector.finishAll()在任意地方结束所有Activity退出程序。