Activity在应用中负责与用户进行交互的组件,为用户提供了可视化的界面。一个App必定是由多个Activity组成的,不客气的说,Activity是四大组件中使用最频繁的组件,没有之一。对于Activity,准确的说,应该把它理解为一个容器,我们能看到的一切东西如按钮,复选框,编辑框等,必须放在Activity里面使用setContentView方法方可显示。
Activity的生命周期可以分为七个阶段 如图(来源百度):
①onCreate(Bundle savedInstanceStatus): 创建Activity时被回调,但只会被回调一次
②onStart(): 启动Activity时被回调。
③onRestart(): 重新启动Activity时被回调
④onResume():恢复Activity时被回调, onStart()方法后一定会回调Resume()
⑤onPause(): Activity暂停时回调
Activity的加载模式有四种,分别是:standard标准模式(如果不设置将默认使用),singleTop(Task顶单列模式),singleTask(Task内单列模式),以及singleInstance(全局单例模式)
Android通过Task管理Activity的,Task可理解为栈,栈是一种典型的先入后出的数据机构。
standard标准模式:每一个Activity都可以启动本身的Activity。
singleTop模式:当Activity位于栈顶时,系统不会创造新的Activity
singleTask模式:该模式分三种情况① 当要启动的Activity不存在时,系统将会创建目标Activity,同时将它放在栈顶 ② 如果该Activity已经位于栈顶时,那么和singleTop模式一样。 ③ 如果启动的Activity没有位于栈顶,那么将会将Activity上面的所有的Activity移出Task栈,使该Activity位于栈顶
singleInstance模式:该模式只会创建一个Activity实例,类似于单列模式,分为两种情况,①如果启动的Activity还没有创建,那么将会创建一个Task,同时创建一个Activity,并且将它放入栈顶 ② 如果启动的Activity已经存在,那么,系统会将该Task移动到前台,从而使该Activity显示出来。
不同的Activity之间需要传递数据,页面之间的跳转,可以通过页面之间的意图(Intent)来实现。但是只有Intent还是不行,我们还需要包裹Bundle,因为Intent就只是相当于一个邮差,邮差只有包裹怎么传递信息啊,包裹才是信息啊
方法 | 说明 |
---|---|
putXxx(String key,Xxx date) | 向Bundle放入数据,支持Int,Long,boolean |
putSerializable(String key,Serializable date) | 向Bundle中加入一个可序列化的对象 |
Xxx getXxx(String key) | 从Bundle中取出Xxx类型的数据 |
Xxx getSerializable(String key, Serializable date) | 向Bundle取出一个可序列化的对象 |
代码示例
Bundle bundle = new Bundle();
bundle.putChar("key", 'd');
bundle.putBoolean("key", true);
bundle.putCharArray("key", d);
方法 | 说明 |
---|---|
putExtras(Bundle date) | 向Intent中加入需要携带的数据包 |
Bundle getExtras() | 从Bundle中取出数据包 |
代码示例
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putChar("key", 'd');
bundle.putBoolean("key1", true);
intent.putExtras(bundle);
方法 | 说明 |
---|---|
putExtras(String key, Xxx value) | 向Intent中加入需要携带的Xxx类型数据包 |
Xxx getExtras(String key) | 从Intent中取出Xxx数据包 |
代码示例
Intent intent = new Intent();
intent.putExtra("key1", "haha");
intent.putExtra("key2", true);
intent.putExtra("key3", 123);
温馨提示:如果多个Activity需要共享数据,比如有三个Activity页面A,B,C,打开顺序是A→B→C, 如果将A页面产生的数据发送给C的话,就不应该采用Intent依次传递数据,建议使用重写Application共享数据。
使用Activity需要在AndroidManifest.xml中显示配置,不仅仅是Activity,其它三大控件同样需要显示配置(Service, ContentProvider,BroadcastReceiver)。
代码示例
<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>
由于Actiivty运行在主线程(UI线程),因此不能执行一些耗时的操作,比如操纵数据库,网络请求等,否者可能引发ANR异常,解决方法是采取异步或者在Activity中单独开一个线程执行耗时的任务。
之前一直没有使用该方法,今天,借着写博客把这个方法给研究一下。startActivityForResult()与startActivity()相比,被打开的页面可以向最初的Activity返回信息,而startActivity() 方法是向被打开的Activity传递信息,因此它们两信息传递的方向是相反的。
首先我们来看下startActivityForResult(Intent intent, int requestCode). intent很简单,只是指定启动那个Activity,主要我们来看一下requestCode,这个参数作用就是判断谁(控件)发出了请求,举个例子:在一个Activity中,有两个按钮,分别可以打开同一个的Activity,当返回到当前的Activity(即包含两个按钮的Activity)时,我们需要知道,究竟是那个按钮打开了指定的Activity。我们就可以根据requestCode判断了。
通常,使用startActivityForResult()时,我们需要重写onActivityResult(int requestCode, int resultCode, Intent data)
requestCode 用来判断请求来自于界面的那个控件。
resultCode 用来判断被打开的Activity是否完成了任务,请求码是被打开的Activity发出的,因此也可以判断,返回的信息来自于那个Activity。
Demo演示
public class First extends Activity {
private Button btn;
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.btn);
text = (TextView)findViewById(R.id.text);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(First.this, Second.class);
startActivityForResult(intent,1);
}
});
}
@SuppressLint("ShowToast") @Override
public void onActivityResult(int requestCode, int resultCode, Intent intent){
//信息来自第二个Activity且任务完成 PS:requestCode和resultCode的值可以根据业务任意指定
if(requestCode == 1 && resultCode == 2){
String msg = intent.getStringExtra("msg");
text.setText(msg);
Log.v("dd", msg);
}
}
}
第二个Acitivity
public class Second extends Activity {
private Button second_btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
second_btn = (Button) findViewById(R.id.second_btn);
second_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
// 将要返回的信息是"Happy New Year!"
intent.putExtra("msg", "Happy New Year!");
//设置结果码为2.
setResult(2, intent);
finish();
}
});
}
}
夜已经深了!心里感概万千。路在何方啊!现在学习比较浮躁,也不想看书,更加坑爹是,每天都要出去练车,课时都不够了,也不知道为什么,今天练车状态很不好,老感觉压线了。明明前几天练习的都感觉都没什么问题的了,今天老在倒库哪里出问题,礼拜三就校考了,不希望科二再挂了。
写博客确实是和自己的惰性在较劲,这篇博客躺在草稿箱好几天了,今天咬牙更了,但是感觉写的不怎么样,将自己平时于Activity的理解写下来,算是总结吧!但是也不全,关于Activity的继承关系也没说。 哎!!!
不说了。。睡觉了。晚安吧!