一丶Activity
概念:activity是安卓四大组件之一,用于显示用户界面,可以理解成手机屏幕。它存储在Task中,遵循先进后出的原则。
生命周期:启动一个activity时,执行顺序为onCreate -> onStart -> onResume;
结束activity时执行顺序为:onPause(可见不可交互) -> onStop(不可见) -> onDestroy;
当当前activity不可见时,比如突然来电话了,执行顺序为:onPause ->onStop,恢复时执行顺序为onRestart -> onStart -> onResume;
而当当前activity变成透明或弹出Dialog时,activity执行onPause,恢复时执行onResume
注意:被暂停的activity在内存不足而当前activity需要内存时会被kill掉
Activity完整生命周期如下图:
创建一个Activity:1.新建一个activity,默认创建布局文件.xml
2.重写activity中的onCreat(),利用setContentView()设置要显示的布局文件以及对一些组件进行初始化操作
例如:
public class CrimeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime); // 设置布局界面
Button mButton = (Button) findViewById(R.id.button_test); //获取按钮对象
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击事件
}
});
}
}
3.在AndroidManifest.xml中进行activity的显示设置
例如:
<activity android:name=".CrimeActivity"
android:icon="图标"
android:label="标题"
android:theme="主题">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
启动Activity:1.单纯启动一个activity:
通过startActivity()来启动一个activity,参数为一个Intent对象,获取Intent对象可以通过显示或隐式来获得,最常见的为:
startActivity(newIntent(当前Act.this,要启动的Act.class));
通过包名来启动activity:
Intent intent = getPackageManager().getLaunchIntentForPackage("apk第一个启动的Activity的全限定类名") ;
if(intent != null) startActivity(intent) ;
2.需要接收子activity返回来的数据
通过startActivityForResult(Intent intent, IntrequestCode)启动,重写onActivityResult(int requestCode, intresultCode, Intent intent)来处理接并处理收子类数据,子类中通过setResut(intresultCode[ ,ntent intent]
3.activity之间数据传输:多个数据传输可以借助Bundle对象
mAnswer = getIntent().getBooleanExtra("answer", false) ;
Activity加载模式:加载模式在AndroidManifest.xml进行设置,属性为launchMode
模式一:standard 此方式为默认方式。每次启动一个activity都会创建一个实例压入栈顶中
模式二:simgleTop 此方式和standard区别是,如果activity存在与栈顶,则不创建实例,只要不在顶都会创建实例
模式三:singleTask a.如果没有activity实例,则创建一个实例压入栈顶
b.如果存在activity实例且在栈顶,则不会创建另一个实例
c.如果存在activity实例但不再栈顶,则会销毁此activity上的其它实例,让自己处于栈顶
模式四:singleInstance a.如果activity不存在,则会创建另一个Task来容纳activity实例进行显示
b.如果activity存在,则会直接调用实例存在的那个Task,让其显示在当前界面
解决因横屏导致数据丢失的情况:重写activity中onSaveInstanceState(Bundle outState )方法,将数据保存在Bundle对象中,然后在onCreat()方法中取出数据加入初始化
例如:
1.activity中重写onSaveInstanceState存入数据
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("data", String.valueOf(mShowAnswer.getText()));
outState.putBoolean("ischeat", true);
}
}
2.在onCreat()方法中设置数据
if (savedInstanceState != null){
mShowAnswer.setText(savedInstanceState.getString("data"));
isCheat(savedInstanceState.getBoolean("ischeat"));
}