说在前面
学了android已经几个月了,基础已经学完了,几天不看基础,感觉一些不常用的已经忘了,在学习第三方开源框架时,很多基础用得模模糊糊的,不是很顺心,于是想尝试写博客,来做总结,毕竟基础才是最重要的,顺便做些项目,为了后面好找工作。
Activity
Activity是一个提供给用户交互的组件,我们可以通过它做许多事情,比如打电话,拍照,发邮件,浏览地图等等。每个Activity是提供给用户交互的窗口,这个窗口一般是填充屏幕,但也可能比窗口小,并浮动在其他窗口顶部。在mvc设计模式中一般作为c控制层。
Activity创建
创建一个activity,你必需继承Activity(或子接口)。然后实现里面的回调方法,activity的生命周期有很多回调方法,onCreate是必须实现的,在该回调方法里面,主要用来加载页面布局,初始化页面控件。加载布局调用setContentView方法。activity创建好了,需要在清单文件manifest中注册,代码如下
<manifest ... >
<application ... >
<activity android:name=".ExampleActivity" />
...
</application ... >
...
</manifest >
如果你想将该activity放在launch列表,和打开应用作为主页面,可以在清单文件中注册如下
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Activity之间传递值
activity之间可以通过Intent传递多种类型的值,那么可以那些类型的值了? 实践结果有以下几种:基本数据类型,String, 自定义对象, 数组,ArrayList(可能还有,以后知道再补)。自定义对象需要实现序列化接口。实现自定义对象序列化一般有两种方式。
Parcelable
该接口是在android里面提出的,因此更适合于android平台,它的缺点就是有点麻烦,但是效率很高,parcelable主要用在内存序列化上。Seriaizable
该接口是java提出的,该接口使用很简单,但效率比parcelable低,该接口主要用在磁盘序列化上,将对象序列化到存储设备中或通过网络传输给其他客户端,可以使用该接口。
activity传值通过intent.putExtra(或其他)传值,也可以通过Bound传递。
activity接受传递的值可以通过getIntent来接受,由于相对简单,就不多说了。
Activity返回值
有时,你想要接受一个你启动的activity的返回值,你可以调用startActivityForResult()方法,然后实现onActivityResult()方法。
官方代码:
private void pickContact() {
// Create an intent to "pick" a contact, as defined by the content provider URI
Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// If the request went well (OK) and the request was PICK_CONTACT_REQUEST
if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
// Perform a query to the contact's content provider for the contact's name
Cursor cursor = getContentResolver().query(data.getData(),
new String[] {Contacts.DISPLAY_NAME}, null, null, null);
if (cursor.moveToFirst()) { // True if the cursor is not empty
int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
String name = cursor.getString(columnIndex);
// Do something with the selected contact's name...
}
}
}
这里提下activity启动方式有两种:
startActivity(显示意图,隐式意图) startActivityForResult
生命周期
Activity生命周期管理是靠实现回调方法来管理,通过生命周期方法可以加强应用健壮性和灵活性。activity生命周期是直接影响其他activities和会退栈。
activity存在三种状态:运行(Resumed), 暂停(Paused), 停止(Stopped)
activity生命周期回调方法:
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible.
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now "resumed").
}
@Override
protected void onPause() {
super.onPause();
// Another activity is taking focus (this activity is about to be "paused").
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped")
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
}
@Override
protected void onRestart() {
super.onRestart();
// The activity is Restart.
}
}
状态图:
常见生命周期状态转换
a.正常启动Activity:FirstActivity.onCrate()-FirstActivity.onStart()-FirstActivity.onResume() Resume
a1.点击Back键:FirstActivity.onPause()-FirstActivity.onStop()-FirstActivity.onDestroy(),再次进入Activity,FirstActivity.onCrate()-FirstActivity.onStart()-FirstActivity.onResume()
a2.点击Home键:FirstActivity.onPause()-FirstActivity.onStop(),再次进入Activity,FirstActivity.onRestart()-FirstActivity.onStart()-FirstActivity.onResume()
b.两个Activity之间切换(FirstActivity跳转到SecondActivity)
FirstActivity.onPause()-SecondActivity.onCreate()-SecondActivity.onStart()-SecondActivity.onResume()-FirstActivity.onStop()
b1.两个Activity之间切换(FirstActivity.finish()跳转到SecondActivity:)
FirstActivity.onPause()-SecondActivity.onCreate()-SecondActivity.onStart()-SecondActivity.onResume()-FirstActivity.onStop()- FirstActivity.onDestroy()
b2.两个Activity之间切换(FirstActivity跳转到SecondActivity-android:style=”@android:style/Theme.Dialog”)
FirstActivity.onPause()-SecondActivity.onCreate()-SecondActivity.onStart()-SecondActivity.onResume()
c.配置改变Activity生命周期变化(语言,屏幕旋转)
销毁当前的Activity-onPause()-onStop()-onDestroy(),重新创建onCrate()-onStart()-onResume()
android:configChanges=”keyboard|orientation|screenSize”生命周期方法总结
状态保存
Activity生命周期中保存用户两种方式
1.onPause() 持久化
2.onSaveInstanceState(). 临时状态
1.onCreate()
2.onRestoreInstanceState()
Activity栈
一个应用中通常包含多个Activity,每个Activity都应该被一种结构管理,以方便用户启动,这种结构就是栈,栈就是为了去收集这些Activity以方便和用户交互,然后展示给用户。
Activity lunchMode加载模式
使用manifest file
standard
默认的启动模式,每次启动都会创建新的实例覆盖在原Activity上
singleTop
在启动时,系统会判断当前栈顶是不是要启动的Activity,如果是则不需要创建直接引用栈顶Activity,并且调用onNewIntent,否则创建。 一般用到接收消息后显示的界面。
singleTask
1.同一App中:在启动时,检测整个Activity栈中是否存在当前需要启动的Activity。如果存在,则将Activity置于栈顶,并将Activity以上的Activity都销毁。
2.不同应用:其他程序以SingleTask模式来启动这个Activity,那么他将创建一个新的任务栈。如果启动模式为SingTask的Activity已经在后台一个任务栈中,那么启动时,后台任务栈将一同被切换到前台。当用户按下返回键时,也会优先返回这个任务栈的Acitivity,一般用来退出整个应用。(参考下面图解)
singleInstance
申明为这种模式的Activity会出现在一个新的任务栈中,而且该任务栈中只会出现这个Activity。这种启动模式常用于需要与程序分离的界面,可以实现多个Activity共享。
- 使用Intent flags
FLAG_ACTIVITY_NEW_TASK
每次启动都会在一个新的Task中启动,该Flag通常用于从Service中启动Activity,由于在Service中并不存在Activity栈,所以用该FLag创建一个Task,并在该任务栈中创建Activity
FLAG_ACTIVITY_SINGLE_TOP
使用SingleTop模式创建Activity
FLAG_ACTIVITY_CLEAR_TOP
使用SingleTask模式创建Activity
Activity亲和性
亲和性Handling affinities指的是Activity更愿意属于哪个任务栈。默认情况下,所有activity都在同一个应用中,也就是同一个任务栈中。但是你也可以修改activity的affinity。activity定义在不同应用中可以共享同一个affinity ,或者同一个应用能指定不同task affinities。
两种方式启动affinity
- 1. FLAG_ACTIVITY_NEW_TASK
- 2. allowTaskReparenting (清单文件中)
可以用 taskAffinity 属性指定不同的affinities 和每个应用联系
清空任务栈
- clearTaskOnLaunch
每次返回该Activity,都将该Activity之上的Activity清除掉,通过这个属性可以保证只用这个Activity。
- finishOnTaskLaunch
每次返回该Activity,,都将该Activity finish掉。
- alwaysRetainTaskState
设置为true时,该Activity所在task将不接受任何清理命令,一直保持当前的Task状态。
最后
这里只是Activity部分知识点,还有些知识点不是很懂,以后懂了就会慢慢补上。