您的位置:首页 > 移动开发 > Android开发

Activity进阶知识整理

2015-10-27 19:05 429 查看
      activity可以算是android中比较重要的组件了.虽然用了快两年的时候,但是却没有对activity做一个系统的知识梳理.特发此篇博客用于对activity的知识的梳理.

 转载请标明出处:http://write.blog.csdn.net/postlist


一 .Activity相关:

    1.onstart()和onstop()是从activity是否可见的角度来看的,而onpause()和onresume()是从activity是否位于前台的的角度的来说明的,在实际使用中并没有什么实际的区别.

    2.当我们的activity进行横竖屏切换的时候实际上会先将activity进行销毁然后进行重建.生命周期的调用如下图所示:

    04-12 23:53:13.388 2650-2650/? D/--: Activity__onPause

    04-12 23:53:13.388 2650-2650/? D/--: Activity__onStop

    04-12 23:53:13.388 2650-2650/? D/--: Activity__onDestroy

    04-12 23:53:13.442 2650-2650/? D/--: Activity__onCreate

    04-12 23:53:13.443 2650-2650/? D/--: Activity__onStart

    04-12 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("--", "我的代码");
}
 
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//当程序从异常中恢复过来的时候拿到储存的数据
tv.setText(savedInstanceState.getString("--"));
}


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


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d("==", "调用了onActivityResult方法");
switch (requestCode) {
case mRequestCode:
if (resultCode == 2) {
String res = data.getStringExtra("xixi");
Log.d("==", "activity返回的值是==" + res);
}
break;
}
}


     activity2中的代码

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息