activity可以算是android中比较重要的组件了.虽然用了快两年的时间,但是却没有对activity做一个系统的知识梳理.特发此篇博客用于对activity的知识的梳理.
转载请标明出处:https://blog.csdn.net/unreliable_narrator
一 .Activity相关:
1.onstart()和onstop()是从activity是否可见的角度来看的,而onpause()和onresume()是从activity是否位于前台的的角度的来说明的,在实际使用中并没有什么实际的区别.
2.当我们的activity进行横竖屏切换的时候实际上会先将activity进行销毁然后进行重建.生命周期的调用如下面所示:
23:53:13.388 2650-2650/? D/--: Activity__onPause
23:53:13.388 2650-2650/? D/--: Activity__onStop
23:53:13.388 2650-2650/? D/--: Activity__onDestroy
23:53:13.442 2650-2650/? D/--: Activity__onCreate
23:53:13.443 2650-2650/? D/--: Activity__onStart
23:53:13.443 2650-2650/? D/--: Activity__onResume
3.设置activity只能够横屏或者是竖屏显示
<activity
android:name=".SecondActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait">
</activity>
4.在activity将要异常关闭的时候就会调用onSaveInstanceState()方法来保存相关的数据.onRestoreInstanceState()方法则是程序从异常中恢复过来时调用的方法.
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//当程序异常终止的时候存储数据
outState.putString("key", "value");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//当程序从异常中恢复过来的时候拿到储存的数据
tv.setText(savedInstanceState.getString("key"));
}
5.启动一个新的activity有两种方式.一种是通过隐式启动,另外一种是通过显示启动.一般在同一个应用中使用显示的方式打开另一个界面,如果要打开其他应用的界面就需要使用到隐式意图进行打开.
(1.) 显示启动:
startActivity(new Intent(MainActivity.this, SecondActivity.class));
(2.) 隐式启动:
先需要在清单文件中进行配置:
<activity
android:name=".SecondActivity">
<intent-filter>
<action android:name="com.dapeng.cn"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
Intent intent = new Intent();
intent.setAction("com.dapeng.cn");
startActivity(intent);
6.Activity之间传递数据的方式:
( 1.)通过Intent进行数据的传递:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("test", "测试代码");
intent.putExtras(bundle);
startActivity(intent);
或者是通过:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("test", "测试代码");
startActivity(intent);
在另外一个activity里面接收传递过来的参数:
String s = getIntent().getStringExtra("test");
(2.)使用静态变量来传递参数:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
SecondActivity.name = "旺财";
startActivity(intent);
在另外一个activity里面接收传递过来的参数:
public static String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.d("--", "name======" + name);
}
7.activity的启动模式.设置activity的启动模式一共有两种方式,一直是直接在清单文件设置launchMode另外的一种就是通过代码直接进行设置.
(1.) 通过清单文件配置:
<activity
android:launchMode="standard"
android:name=".SecondActivity">
</activity>
对应的有四种启动模式:
stand: 默认的启动模式,每次都会创建一个activity的实例并且加到task栈顶.
singletop: 如果activity位于task任务栈最顶部,那么就不会去创建activity的实例.
singletask: 单一实例,也就是在activity的只拥有一个实例.
singIntense:单一任务栈,使用这种模式会创建出一个新的任务栈,并且这个activity拥有自己的上下文,与其他activity是相对独立的.
注意:当使用singletask或者是singIntense启动界面以后如果后面再次打开该界面是不会再调用oncreate()的方法的,如果我们想要通过intent传值的话,可以使用onNewIntent(Intent intent)方法.
(2.)通过设置intent的flag.
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
<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类似。简而言之,跳转到的activity若已在栈中存在,则将其上的activity都 销掉。
<2.FLAG_ACTIVITY_NEW_TASK:例如现在栈1的情况是:A B C。C通过intent跳转到D,并且这个intent添加了FLAG_ACTIVITY_NEW_TASK标记,如果D这个Activity在Manifest.xml中的声明中添加了Task affinity,系统首先会查找有没有和D的Task affinity相 同的task栈存在,如果有存在,将D压入那个栈,如果不存在则会新建一个D的affinity的栈将其压入。如果D的Task affinity默认没有设置,则会把其压入栈1,变成:A B C D,这样就和不加FLAG_ACTIVITY_NEW_TASK标记效果是一样的了。注意如果试图从非activity的非正常途径启动一个activity(例见下文“intent.setFlags()方法中参数的用例”),比如从一个service中启动一个activity,则intent比如要添加FLAG_ACTIVITY_NEW_TASK标记(编者按:activity要存在于activity的栈中,而非activity的途径启动activity时必然不存在一个activity的栈,所以要新起一个栈装入启动的activity)。简而言之,跳转到的activity根据情况,可能压在一个新建的栈中。
<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根本就没有被压入栈中。简而言之,跳转到的activity不压在栈中。
<4.FLAG_ACTIVITY_SINGLE_TOP:和Activity的Launch mode的singleTop类似。如果某个intent添加了这个标志,并且这个intent的目标activity就是栈顶的activity,那么将不会新建一个实例压入栈中。简而言之,目标activity已在栈顶则跳转过去,不在栈顶则 在栈顶新建activity.
8.activity的跳转动画.
在页面切换的时候我们可硬通过overridePendingTransition(R.anim.outer, R.anim.inter);方法来设置页面的切换动画.该方法接受两个动画资源.首先anim文件里面设置动画资源.
startActivity(intent);
overridePendingTransition(R.anim.outer, R.anim.inter);
inter:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator" >
<alpha
android:duration="1000"
android:fromAlpha="1.0"
android:toAlpha="0" />
</set>
outer:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:zAdjustment="top">
<alpha
android:duration="1000"
android:fromAlpha="0"
android:toAlpha="1.0"/>
</set>
9.设置activity为启动界面.
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
10.activity打开一个界面获取返回值.在activity1中使用startActivityForResult()方法开启一个新的activity2,当这个新的activity关闭的时候可以通过setresult来给activty1返回相关数据,在activity1中 通过OnactivityResult()接受 界面2返回过来的参数.
activity1中的代码
startActivityForResult(intent, mRequestCode);
Intent intent = new Intent();
intent.putExtra("xixi", "来自界面二的问候");
setResult(2, intent);
11.在activity里重写返回键的逻辑,有两种方式一种是使用onkeydown()方法,另外一种是使用onbackpressed();
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(MainActivity.this, "返回键被调用了", Toast.LENGTH_SHORT).show();
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
或者:
@Override
public void onBackPressed() {
Toast.makeText(MainActivity.this, "返回键被调用了", Toast.LENGTH_SHORT).show();
}