2016-05-06安卓之Activity

Posted 暴走灬青春

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2016-05-06安卓之Activity相关的知识,希望对你有一定的参考价值。

1.  Activity中的lable是指activity的名字,如果此activity还指定了:以下intentfilter,
那么这个界面就会在桌面创建快捷方式,快捷方式名字就是这个activity的lable
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Category:指定意图的类别, Launcher是在桌面创建快捷方式。

Intent-filter子节点:添加意图过滤,可以通过隐式意图启动。
可以在桌面生成快捷方式,应用程序的入口。
注意: Intent传递的数据过多可能会造成跳转速度极慢甚至黑屏一会,不要
用Intent传递过多的数据,会影响到应用程序的使用。



##1. Activity的创建和销毁(*)
1. 清单文件内容:
电话  浏览器 清单文件内容
    权限
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.INTERNET"/>

<intent-filter>
     <action android:name="android.intent.action.MAIN" />
     <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<activity android:name="com.guyulei.activity2.MyBrowserActivity"
            android:label="周红伟浏览器"
            android:icon="@drawable/xiaowei">

category:类型,部门,种类,类别,类目; [逻,哲]范畴; 体重等级
scheme:策划,图谋;   前缀
 filter :滤波器; 滤光器; 滤色镜; [化] 过滤器;


            <intent-filter >
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.APP_BROWSER"/>
                <data android:scheme="http"/>
                <data android:scheme="https"/>
                <data android:scheme="about"/>
                <data android:scheme="javascript"/>
            </intent-filter>
        </activity>

小结: 每一个类对应自己的activity  绑定自己的xml文件  activity在清单中注册
隐式跳转(隐式意图跳转)(效率低) 
多用于不同App之间Activity的跳转,通过匹配目标Activity的intent-filter来实现的跳转
意图过滤器匹配规则
    1. 如果一个Activity有多个intent-filter,那么我们只需要匹配其中的任意一个即可
    2. 如果intent-filter中有action、category、data,必须全部匹配
    3. 如果category是<category android:name="android.intent.category.DEFAULT" />情形下,可以不进行匹配。
    4. 如果有多个category,那么取其任意一个匹配即可
    5. 如果data有多个,那么取其任意一个匹配即可
    6. 如果data有两个,并且属性还不一样,那么这个data的两个属性必须全部匹配


MainActivity:
隐式跳转:打电话Intent.ACTION_CALL
public void callPhone(View view)
        //2
        Intent intent = new Intent();
        //3
        intent.setAction(Intent.ACTION_CALL);
        //4
        intent.addCategory(Intent.CATEGORY_DEFAULT);//默认可以不写
        //5
        intent.setData(Uri.parse("tel:15958121433"));
        //1
        startActivity(intent);

    
隐式跳转:浏览器Intent.ACTION_VIEW
public void callBrowser(View view)
        //2
        Intent intent = new Intent();
        //3
        intent.setAction(Intent.ACTION_VIEW);
        //4
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        //5
        intent.setData(Uri.parse("http://www.baidu.com"));
        //1
        startActivity(intent );
    

不同工程之间隐式跳转   前提需要知道清单文件中的activity的信息
intent.setDataAndType  有data和type时注意不能共存
type  的格式  MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。类型/子类型
清单文件:
附:第二个工程的清单  data android:mimeType
    <activity 
            android:name="com.guyulei.activity02.MyActivity">
            <intent-filter >
                <action android:name="com.guyulei.zhonghongwei.TEST"/>//自己随便设置 跳转时配置一样即可
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="guyulei2zhouhongwei"/>//传输时的数据格式   前缀+:
                <data android:mimeType="gu/zhou"/>     //数据 的类型
            </intent-filter>
        </activity>

        /* 
     * 不同工程activity之间进行跳转
     */
    public void skip2guyulei(View view) 
        Intent intent = new Intent();

        //setAction 对应清单文件中activity的action  一致即可
        intent.setAction("com.guyulei.zhonghongwei.TEST");

        intent.addCategory("android.intent.category.DEFAULT");
        /*
         * setData  setType 不共存
         * 使用setDataAndType 解决
         * intent.setData(Uri.parse("guyulei2zhouhongwei:周小伟"));
           intent.setType("gu/zhou");
         */
        intent.setDataAndType(Uri.parse("guyulei2zhouhongwei:周小伟"), "gu/zhou");
        startActivity(intent );

    

MyBrowserActivity:
拿到intent的数据,intent启动此activity,此activity得到intent的数据
intent的数据从哪来?在清单里面设置数据的格式 在启动intent的时候 加上数据 
//intent.setData(Uri.parse("http://www.baidu.com"));

getIntent()
intent.getDataString();
protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);


        //获取谁启动了这个activity的intent,数据在intent内
        //intent.setData(Uri.parse("http://www.baidu.com"));

        Intent intent = getIntent();
        String dataString = intent.getDataString();
        Log.d(TAG, dataString);
        Toast.makeText(this, "您浏览的网页是:"+dataString, Toast.LENGTH_SHORT).show();
    
第二个工程中
MyActivity
第一个工程中的intent 来到第二个工程  带来第二个工程格式 的 数据
intent.setData(Uri.parse("guyulei2zhouhongwei:周小伟"));
intent.setDataAndType(Uri.parse("guyulei2zhouhongwei:周小伟"), "gu/zhou");

protected void onCreate(Bundle savedInstanceState) 

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取周小伟activity 中在intent内封装的数据
        //data 和type 分开拿
        Intent intent = getIntent();
        Uri data = intent.getData();
        String type = intent.getType();

        Log.d(TAG, "data="+data+"....."+"type="+type);
        Toast.makeText(this, "data:"+data+"type:"+type, Toast.LENGTH_SHORT).show();
    


2. 显式跳转  常用于工程内部
显示跳转(显示意图跳转)(效率高)
直接通过目标Activity的字节码进行的跳转,多用于本APP内不同Activity之间。
如果Activity只想被显示跳转,那么没有必要配置intent-filter。
跳转代码
  startActivity(new Intent(this, SecondActivity.class));



清单文件 注册activity
<activity 
            android:name="com.guyulei.activity03.MySecond"></activity>

MainActivity:  intent.setClass(this, MySecond.class);
        intent.putExtra("name", "顾雨磊");
android:text="我是第一个activity,跳到second"

public void skip2second(View view) 

        Intent intent = new Intent();
        intent.setClass(this, MySecond.class);

        //显示跳转 给second传数据
        intent.putExtra("name", "顾雨磊");
        intent.putExtra("age",26);
        intent.putExtra("lover", "周小伟");

        startActivity(intent);
    

MySecond:
拿数据:拿数据先拿意图intent  getIntent()
intent.getStringExtra("name");
protected void onCreate(Bundle savedInstanceState) 
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        /*
         * 显示传递数据   拿数据先拿意图intent
         */
        Intent intent = getIntent();

        String name = intent.getStringExtra("name");

        int age = intent.getIntExtra("age", 0);

        String lover = intent.getStringExtra("lover");

        Log.d(TAG, "name="+ name +"age= "+ age+"lover="+lover);
        Toast.makeText(this, "信息是:"+"name="+ name +"age= "+ age+"lover="+lover, Toast.LENGTH_LONG).show();
    


MainActivity:   startActivityForResult(intent , REQUESTCODE); 以需求得到结果的方式跳到second
REQUESTCODE
android:text="跳到sec并获取其返回值" 
android:onClick="skip2secondforResult"

//跳转到second并获取其销毁时的返回值
    public void skip2secondforResult(View view) 

        Intent intent = new Intent();
        intent.setClass(this, MySecond.class);

        startActivityForResult(intent , REQUESTCODE);
    


MySecond:
android:text="返回数据给mainactivity并销毁自己"
RESULTCOE   setResult(RESULTCOE, data );

//谁启动我,我就将数据返回给谁,并销毁自己
    public void back(View view) 
        Intent data = new Intent();
        //封装数据进行返回
        data.putExtra("data", "这是secondactivity给您返回的数据");

        setResult(RESULTCOE, data );
        finish();
    

MainActivity:  onActivityResult
//调用回调函数获取second返回的数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);

        Log.d(TAG, "requestCode="+requestCode+"resultCode="+resultCode+"data="+data);

        if(requestCode==REQUESTCODE)
            if(resultCode==1)
                //拿到数据
                String result = data.getStringExtra("data");
                Log.d(TAG, "result="+result);
                Toast.makeText(this, "second销毁时返回的数据是:"+result, Toast.LENGTH_LONG).show();
            
        
    

3. Intent可以携带的数据类型哟哪些?
    1. 8种基本数据类型以及其对应的数组形式
    2. String 以及其数组
    3. 实现Serializable接口的对象
    4. 实现Parcelable接口的对象

4. Serializable和Parcelable的区别?
    1. 前者是java里面的,后者是Google自己开发的
    2. 前者效率低一些,后者效率高一些,专门用于Android系统中的序列化
    3. 用法完全不同,前者很简单,后者很复杂。

5. Activity跳转时传递数据并获取
    1. intent.putXXX();
    2. getIntent().getXXXExtr("key",defaultValue);

6. 当跳转到的Activity销毁时返回数据(必须会)
    1. 在MainActivity中,启动SecondActivity的时候,不能用startActivity()了,
        使用startActivityForResult(intent, requestCode)
    2. 在SecondActivity中,在finish前,调用setResult(responseCode,Intent data);方法设置即将要返回的数据,然后finish()
    3. 在MainActivity中覆写onActivityResult(),在该函数中获取SecondActivity设置的数据

##3. Activity的生命周期(*****)

###3.1 Activity的三种状态
1. Resumed(running运行状态):如果Activity位于屏幕的最前端,并且获取到了用户的焦点。
    1. 完全可见,可交互。
    2. 不会被系统杀死的,直到OOM,然后崩溃。
2. Paused(暂停状态):被另外一个Activity给覆盖了,但是自己依然部分可见(透明的,或者比较下)。
    1. 部分可见,不可交互。
    2. 当系统内容及其不足的时候,会被系统杀死。
3. Stopped(停止状态):如果当前Activity被另外一个Activity给完全覆盖了(后台Activity)。
    1. 完全不可见,更不可交互
    2. 当系统需要释放内存的时候,就会杀死。


###3.2生命周期方法
1. onCreate
2. onStart
3. onResume
4. onPause
5. onStop
6. onDestroy
7. onRestart

    <activity
            android:screenOrientation="reverseLandscape"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <activity 
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
            android:name="com.guyulei.activity04.MySecond"></activity>

让Activity成为对话框样式
  在清单文件中给指定的Activity配置如下参数即可:
  android:theme="@android:style/Theme.Dialog"

让Activity成为透明的
  在清单文件中给指定的Activity配置如下参数即可:
  android:theme="@android:style/Theme.Translucent"

##4 横竖屏切换时的生命周期
模拟器横竖屏切换:(Fn)+Control+F11
 默认情况下,会将当前Activity完全销毁,然后重新创建。
让Activity横竖屏切换时,不改变他的生命周期
在清单文件中,配置如下属性
 android:configChanges="orientation|keyboardHidden|screenSize"

固定Activity的方向
通过配置文件
1. android:screenOrientation="landscape"水平
2. android:screenOrientation="portrait"垂直
通过代码
1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
2. 谁后配置谁生效

##5. Activity的启动模式(****)

Activity是被ActivityManager用栈结构管理的。

###5.1 Activity的四种启动模式
1. standard(标准的也是默认的,如果不配置就是标准的):
    1. 特点:傻瓜式的,每启动一个Activity,就重新创建一个全新的Activity,然后压到栈顶。

2. singleTop 
    1. 特点:如果当前栈顶配置了singleTop的Activity已经存在,那么不会重新创建。

3. singleTask
    1. 特点:保证当前栈只有一份Activity实例,如果有其他Activity将其压住,他想上位是通过将其他Activity全部弹栈的方式。
4. singleInstance
    1. 特点:一个Activity独享一个任务栈。

以上是关于2016-05-06安卓之Activity的主要内容,如果未能解决你的问题,请参考以下文章

Android安卓四大组件之Activity

Android安卓四大组件之Activity

PS图层混合算法之三(滤色, 叠加, 柔光, 强光)

Android安卓四大组件之Activity

Android安卓四大组件之Activity

Android安卓四大组件之Activity