Activity进阶知识整理

      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();

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值