四大组件之Activity

1.Activity概念
        一个活动(Activity)表示一个可视化的用户界面,关注一个用户从事的事件, 一个Activity就是一个屏幕。

2.Activity生命周期
onCreate——onStart——onRestart——  onResume—— onPause—— onStop—— onDestroy
(1)启动Activity: onCreate()onStart()onRestart,若直接退出:onStop(),onDestroy()
(2-1)跳转到另一个Activity: onResume() ;另一个Activity如(1);该Activity调用onPause ()和onStop()方法—— 如果跳转的是Dialog式的Activity则不执行onStop()方法
(2-2)弹出Dialog:与Dialog式的Activity一样
(3-1)按回退键:另一个Activity调用onPause(),该Activity调用onRestart()、onStart()和onResume(),另一个Activity调用onStop()和onDestroy();
 
                                                       Activity生命周期图

3.Activity跳转
(1)一个Activity中弹出另一个Activity
(2)一个Activity中弹出一个Dialog
(3) 一个Activity中弹出一个Dialog样式的Activity
        在清单文件中作如下声明:        
<activity android:name=".Main4Activity"
android:theme="@android:style/Theme.Dialog"></activity>
(4)按关机键忽然进入休眠
(5)弹出输入法
a.显示意图跳转
<activity android:name=".MainActivity2" >
Intent intent = new Intent(this,MainActivity2.class);
startActivity(intent);
b.隐式意图跳转
①在清单文件中注册
<activity android:name=".MainActivity2" >
<intent-filter>
<action android:name="aa.bb.MA" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
intent-filter下一共有三个参数:action/data/category
可以通过设置这些参数的name/style来实现隐式跳转
Intent  intent =  new  Intent ( "aa.bb.MA" ); startActivity(intent);

4.intent传参、取值

(1)传参
intent = new Intent(this,OtherActivity.class);
//方式一:通过Data传参
intent.setData(Uri.parse("tel:18500970874"));
//下行代码需要同时设置,不然后面的会覆盖前边的
intent.setDataAndType(Uri.parse("tel:18500970874"),"text");

//方式二:通过intent.putExtra("键","值")
intent.putExtra("name","zhangsan");
intent.putExtra("age",21);
String[] strs = {"aa","bb","cc"};
intent.putExtra("strs",strs);

//方式三:通过bundle传参
Bundle bundle = new Bundle();
bundle.putString("name","zhifang");
bundle.putInt("age",21);
intent.putExtras(bundle);

//
//方式四:自定义传参:在Person中实现Parcelable接口或者java.io.Serializable接口
Person person = new Person("kongkong", 22);
intent.putExtra("person",person);
Serializable       适用面广、简单,用在Android中intent传参时,会产生大量的临时对象,速度慢
Parcelable         只能在Android中使用、速度快——在eclipse环境下方法提示不全,需要手动补上
实现Parcelable接口会要求实现下面方法
protected Person(Parcel in) {
    //读写顺序相一致,先写什么就先读什么
name = in.readString();
age = in.readInt();
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
// Person p = new Person();// p.name = in.readString();
// p.age = in.readInt();// return p;
            //上面多行代码就相当于下面一行代码
return new Person(in);
}

@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
(2)对应的取参
Intent intent = this.getIntent();
//方式一
Uri uri = intent.getData();
System.out.println(uri);
//方式二
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age",0);
String [] strs = intent.getStringArrayExtra("strs");
System.out.println(name+" "+age);
//方式三
for(String str : strs){
System.out.println(str);
}
Bundle b = intent.getExtras();
System.out.println(b.getString("name"));
System.out.println(b.getInt("age"));
//方式四
//Person p = (Person) intent.getSerializableExtra("person");
Person p = (Person) intent.getParcelableExtra("person");
System.out.println(p.getName()+" "+p.getAge());
Parcelable         只能在Android中使用、速度快
Person person = new Person(22,"xiaowei");
intent.putExtra("person",person);
Person person = (Person) intent.getSerializableExtra("person");
Person person = intent.getParcelableExtra("person");

5.intent传图片
(1) 如果在一个APP中,则直接通过传id即可
(2)如果是在不同APP中,使用Parcelable传递

6.Activity的启动模式
什么是Task?——后进先出(栈)
(1)standard: Activity的默认加载方法,即使某个Activity在Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D 。此时如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。此时如果依次按返回键,D  D C B A将会依次弹出栈而显示在界面上。
(2)singleTop: 如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。例如:现在栈的情况为:A B C D。D的Launch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A B C D B。
 (3) singleTask:如果某个Activity是singleTask模式,那么Task栈中将会只有一个该Activity的实例。例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。
(4)singleInstance: 将Activity压入一个新建的任务栈中。例如:Task栈1的情况为:A B C。C通过Intent跳转到D,而D的Launch mode为singleInstance,则将会新建一个Task栈2。此时Task栈1的情况还是为:A B C。Task栈2的情况为:D。此时屏幕界面显示D的内容,如果这时D又通过Intent跳转到D,则Task栈2中也不会新建一个D的实例,所以两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为C的Launch mode为standard,此时如果再按返回键,则栈1变成:A B C。也就是说现在界面还显示C的内容,不是D。 现在有一个问题就是这时这种情况下如果用户点击了Home键,则再也回不到D的即时界面了。如果想解决这个问题,可以为D在Manifest.xml文件中的声明加上: <intent-filter>        <action android:name="android.intent.action.MAIN" />         <category android:name="android.intent.category.LAUNCHER" />  </intent-filter> 加上这段之后,也就是说该程序中有两个这种声明,另一个就是那个正常的根activity,在打成apk包安装之后,在程序列表中能看到两个图标,但是如果都运行的话,在任务管理器中其实也只有一个。上面的情况点击D的那个图标就能回到它的即时界面(比如一个EditText,以前输入的内容,现在回到之后依然存在)。 PS:intent-filter中 <action android:name="android.intent.action.MAIN" />和 <category android:name="android.intent.category.LAUNCHER" />两个过滤条件缺一不可才会在程序列表中添加一个图标,图标下的显示文字是android:label设定的字符串。 

7.Intent常用FLAG参数
(1)  FLAG_ACTIVITY_CLEAR_TOP:例如现在的栈情况为:A B C D 。D此时通过intent跳转到B,如果这个intent添加FLAG_ACTIVITY_CLEAR_TOP标记,则栈情况变为:A B。如果没有添加这个标记,则栈情况将会变成:A B C D B。也就是说,如果添加了FLAG_ACTIVITY_CLEAR_TOP标记,并且目标Activity在栈中已经存在,则将会把位于该目标activity之上的activity从栈中弹出销毁。这跟上面把B的Launch mode设置成singleTask类似。 
(2)FLAG_ACTIVITY_NEW_TASK:例如现在栈1的情况是:A B C。C通过intent跳转到D,并且这个intent添加了FLAG_ACTIVITY_NEW_TASK标记,如果D这个Activity在Manifest.xml中的声明中添加了Task affinity,并且和栈1的affinity不同,系统首先会查找有没有和D的Task affinity相同的task栈存在,如果有存在,将D压入那个栈,如果不存在则会新建一个D的affinity的栈将其压入。如果D的Task affinity默认没有设置,或者和栈1的affinity相同,则会把其压入栈1,变成:A B C D,这样就和不加FLAG_ACTIVITY_NEW_TASK标记效果是一样的了。      注意如果试图从非activity的非正常途径启动一个activity,比如从一个service中启动一个activity,则intent比如要添加FLAG_ACTIVITY_NEW_TASK标记。 
(3)FLAG_ACTIVITY_NO_HISTORY:例如现在栈情况为:A B C。C通过intent跳转到D,这个intent添加FLAG_ACTIVITY_NO_HISTORY标志,则此时界面显示D的内容,但是它并不会压入栈中。如果按返回键,返回到C,栈的情况还是:A B C。如果此时D中又跳转到E,栈的情况变为:A B C E,此时按返回键会回到C,因为D根本就没有被压入栈中。 
(4) FLAG_ACTIVITY_SINGLE_TOP:和上面Activity的Launch mode的singleTop类似。如果某个intent添加了这个标志,并且这个intent的目标activity就是栈顶的activity,那么将不会新建一个实例压入栈中。
 
8.PackageManager
(1)获取所有安装包的信息 
(2)获取系统与用户应用程序 
(3)获取指定应用程序名称与图标 
(4)启动指定应用程序 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值