Android-Activity笔记
一、Activity定义
Activity是一个应用程序组件,提供用户和程序交互的界面。安卓四大组件之一。
二、Activity创建与使用
1、继承Android的Activity类
2、重新方法
3、设置显示布局
<span style="font-size:18px;">public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
}
}</span>
4、在AndroidManifest文件中注册Activity
<application>
<activity android:name="com.sqb.demo.MyActivity" />
</application>
三、AndroidManifest文件中配置主入口Activity
<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生命周期
onCreate(); 创建
onStart(); 运行
onResume(); 获取焦点
onPause(); 失去焦点
onStop(); 停止
onDestrop(); 销毁
onRestart(); 重新开始
五、Activity的四种状态
1、活动状态(Active / Running )Activity处于界面最顶端,获取焦点。
2、暂停状态(Paused)Activity失去焦点,但对用户可见。
3、停止状态(Stopped)Activity被完全遮挡,但保留所有状态和成员信息。
4、非活动状态(Killed)Activity被停止。
六、Activity的启动模式
1、活动任务栈(Activity task stack)简介:
用来保存创建Activity实例的栈(栈:连续的内存空间,后进先出)
2、配置Activity启动模式
<span style="font-size:18px;"><activity
android:launchMode=”standard”
android:name=”com.sqb.MyActivity” >
</activity></span>
3、四种模式
(1)standard模式:默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
(2)singleTop模式:该Activity在同一个栈中可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
(3)singleTask模式:该Activity在同一个栈中只有一个。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。
(4)singleInstance模式:一个任务栈只有一种Activity实例。若要创建同一个Activity则放到同一个任务栈中,创建其他的Activity则放到另一个任务栈中。
七、Activity的跳转
1、应用场景:
(1)显式启动的效率高于隐式,显式直接跳转,隐式需要遍历action
(2)启动同一应用中的Activity建议用显式
(3)启动不同应用中的Activity建议用隐式
(4)如果系统找到了多个intent-filter与程序员创建的intent匹配,那么就会弹出对话框,列举所有匹配的Activity,让用户选择
(5)隐式跳转兼容性更好,只要匹配action就行了。
2、显式跳转:要求必须要知道被激活的组件的包名和class的名字
第一种写法:
<1>同一应用中,指定目标Activity的字节码和当前的上下文
Intent intent = new Intent();
intent.setClassName(this, Activity.class);
startActivity(intent);
<2>不同应用中,指定目标Activity所在的应用的包名和Activity的全路径名
Intent intent = new Intent();
intent.setClassName(classPageName,classAllPathName);
startActivity(intent);
第二种写法:
<1>同一应用中,指定目标Activity的字节码和当前的上下文
Intent intent = new Intent(this, Activity.class);
startActivity(intent);
<2>不同应用中,指定目标Activity所在的应用的包名和Activity的全路径名
Intent intent = new Intent(classPageName,classAllPathName);
startActivity(intent);
第三种写法:(不常用)
Intent intent = new Intent();
ComponentName comonent = new ComponentName(classPageName,className);
intent.setComponent(component);
startActivity(intent);
3、隐式跳转:当隐式启动时系统会在所有清单文件中寻找与程序员创建的intent匹配的intent-filter,找到则启动,找不到则抛异常。
(1)需要在清单文件的activity标签下,配置intent-filter子节点,其中再配置action和category。
<span style="font-size:18px;"><activity android:name="com.sqb.demo.MyAnotherActivity" >
<!--可以设置多个action,仅需要匹配一个即可跳转-->
<action android:name="com.sqb.a">
<!--可以设置多个scheme,需要匹配一个,若设置mimeType也要匹配-->
<data android:scheme="abc" //数据必须以abc开头
android:host="com.sqb.abc" //数据主机必须是com.sqb.abc
android:mimeType="text/*">
</data>
<!--category 必须要有,默认是android.intent.category.DEFAULT-->
<category android:name="android.intent.category.DEFAULT">
</activity></span>
(2)启动时的代码:
Intent intent = new Intent();
intent.setAction(“com.sqb.abc”);
//如果清单文件中有配置data,则要设置setData,否则不匹配
intent.setData(Uri.parse(“abc:myMSG”));
//如果清单文件中有配置mimeType,则要设置setType,否则不匹配
intent.setType(“text/msg”);
//或者用:intent.setDataAndType(Uri.parse(“abc:myMSG”),”text/msg”);
startActivity(intent);
八、Activity之间传递数据
1、无数据返回跳转startActivity
(1)显式跳转传递数据:
<1>原activity设置数据:
Intent intent = new Intent(this, SecondActivity.class);
//第一种情况,把数据封装到intent中
intent.putExtra(“msg1”,”name”);
intent.putExtra(“msg2”,”sex”);
//第二种情况,把数据封装到Bundle中,再封装到intent中
Bundle bundle = new Bundle();
bundle.putString(“key1”,”lalala”);
intent.putExtras(bundle);
//第三种情况,传递对象
//第一步,该对象需要实现序列号接口Serializable
public class Person implements Serializable
//第二步,传递对象的原始页面调用intent.putExtra()即可
Person obj = new Person();
intent.putExtra("Person", obj);
<2>目标activity接收数据:
//获取启动该Activity的意图对象
Intent intent = getIntent();
//第一种情况
String data = intent.getStringExtra("msg1");
//第二种情况
Bundle bundle = intent.getExtras();
String data1 = bundle.getString("key1");
//第三种情况
intent .getSerializableExtra("Person");
(2)隐式跳转传递数据:
<1>原activity设置数据:
//如果清单文件中有配置data,则要设置setData,否则不匹配
intent.setData(Uri.parse(“abc:myMSG”));
<2>目标activity接收数据:
//获取启动该Activity的意图对象
Intent intent = getIntent();
Uri uri = intent.getData();
2、有数据返回跳转startActivityForResult
A页面:startActivityForResult(Intent intent, int requestCode)
重写onActivityResult(int requestCode, int resultCode, Intent data)
B页面:setResult(int resultCode, Intent data);
finish();