android四大组件之Activity


通过activity返回数据


在otheractivity中通过setResult(int resultcode,Intent data);设置数据


在mainactivity中通过重写onactivityresult(int requestcode,int resultcode,Intent data);
来获得返回的数据,
与此同时开启另一个activity时使用startactivityforresult。




2.隐式意图启动activity


显式意图是指在创建意图时指定了组件,而隐式意图则不指定组件,通过动作、类型、数据匹配对应的组件

在清单文件中定义<activity>时需要定义<intent-filter>才能被隐式意图启动
<activity 
            android:name=".OtherActivity"
            >
            <!-- 必须加category,否则报错 -->
            <intent-filter>
                <action android:name="com.example.activityTest"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data   android:scheme="other"/>
            </intent-filter>
    </activity>


<intent-filter>中至少配置一个<action>和一个<category>,否则无法被启动

Intent对象中设置的action、category、data在<intent-filter>必须全部包含才能启动

例如启动上面的activity时;
Intent intent=new Intent();
intent.setAction("com.example.activityTest");
intent.setData(Uri.parse("other:123123"));

<intent-filter>中的<action>、<category>、<data>都可以配置多个,Intent对象中不用全部匹配,每样匹配一个即可启动
如果一个意图可以匹配多个Activity,Android系统会提示选择

activity生命周期:
Acitivity三种状态
运行:activity在最前端运行
暂停:activity可见,但前端还有其他activity,被覆盖一部分,或者前端activity透明
停止:activity不可见,完全被覆盖
生命周期相关方法
onCreate:创建时调用,或者程序在暂停、停止状态下被杀死之后重新打开时也会调用
onStart:onCreate之后或者从停止状态恢复时调用
onResume:onStart之后或者从暂停状态恢复时调用,从停止状态恢复时由于调用onStart,也会调用onResume
onPause:进入暂停、停止状态,或者销毁时会调用
onStop:进入停止状态,或者销毁时会调用
onDestroy:销毁时调用
onRestart:从停止状态恢复时调用


当我们进行横竖屏切换时,activity会被摧毁,执行onPause onStop onDestroy onCreate onStart onResume
这是我们可以在清单文件中给activity添加属性, android:configChanges="orientation"这个属性可以监听到方向的改变
通过添加 android:screenOrientation="landscape"指定屏幕始终是横屏
但是有时我们希望改变屏幕方向后,原来的数据还可以被保存:这时可以用下面两个方法
onSaveInstanceState:在Activity被动的摧毁或停止的时候调用,用于保存运行数据,可以将数据存在在Bundle中
onRestoreInstanceState:该方法在Activity被重新绘制的时候调用,例如改变屏幕方向,savedInstanceState为onSaveInstanceState保存的数据


@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);

savedInstanceState.getString("out");

}


@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);

outState.putString("out", "推出时的数据");

}


启动模式:
在AndroidManifest.xml中的<activity>标签中可以配置android:launchMode属性,用来控制Actvity的启动模式
在Android系统中我们创建的Acitivity是以栈的形式呈现的
standard:每次调用startActivity()启动时都会创建一个新的Activity放在栈顶
singleTop:如果启动的Activity时,指定Activity不在栈顶就创建,如在栈顶,则不再创建
singleTask:如果启动的Activity不存在就创建,如果存在直接跳转到指定的Activity所在位置
singleInstance:如果启动的Activity不存在就创建,如果存在就将指定的Activity移动到栈顶


1.stantard, 2.singleTop, 3.singleTask, 4.singleInstance
1.标准启动模式
对于每创建一个activity都放在栈里,例如有两个activity A,B,先启动A时,a入栈,b启动,b入栈,a再启动,a再入栈,此时栈里有两个a
2.
singleTop
a,b两个activity,a先入栈。b后入栈,后来再创建a时,则创建a,如果再需要b则创建b,如果再需要b,则不创建新的。

3.singleTask
abcd四个activity,abcd一次入栈,需要a时直接指到a,上面的activity删除。

4.singleInstance
abcd四个activity,abcd依次入栈,如果需要a,则将a移动到栈顶



Android系统在运行多个进程时,如果系统资源不足,会强制结束一些进程。优先选择哪个进程来结束是有优先级的。以下顺序靠上的优先结束
空:进程中所有Activity都已销毁
后台:进程中有一个停止状态的Activity
可见:进程中有一个暂停状态的Activity
前台:进程中正在运行一个Activity




什么是ANR
application not response!!
这是由于在主线程中处理一些耗时的操作,所以为避免产生anr异常。耗时的操作应该放在子线程中来做。

你可能感兴趣的:(android四大组件之Activity)