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的主要内容,如果未能解决你的问题,请参考以下文章