标签:
Android四大组件:Activity,Service,Broadcast Receiver,Content Provider
定义Java类,继承Activity类
在清单文件中配置activity标签
activity标签下如果带有下面这部分代码,则会在系统中多创建一个快捷图标
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
一个应用程序可以在桌面创建多个快捷图标。
Activity的名称、图标可以和应用程序的名称、图标不相同
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
Activity的跳转需要创建Intent对象,通过设置Intent对象的参数指定要跳转Activity
通过指定Activity实现跳转,称为显式意图
通过指定动作实现跳转,称为隐式意图
跳转至同一应用中的Activity
Intent intent = new Intent(); intent.setClass(this, SecondActivity.class);// 指定当前的上下文和目标Activity的字节码 startActivity(intent);
跳转至不同应用中的Activity
Intent intent = new Intent(); // 指定目标Activity所在的应用的包名和目标Activity的包名加类名,这里启动系统自带的拨号器应用 intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity"); startActivity(intent);
隐式意图跳转至打电话Activity
Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:10086")); startActivity(intent);
要让一个Activity可以被隐式启动,需要在该应用清单文件下的activity标签下配置intent-filter子标签
系统会在所有应用的清单文件中寻找与我们创建的隐式Intent匹配的intent-filter,找到则启动,找不到则抛异常
匹配就是intent-filter中定义了什么属性,我们创建的intent中也必须设置什么属性
在清单文件的activity标签下,配置intent-filter子标签,其中再配置action和category
启动同一应用中的Activity,用显式Intent。显式启动效率明显高于隐式,因为显示直接指定了目标Activity,隐式需要遍历所有应用的清单文件
启动不同应用中的Activity,用隐式Intent。当使用隐式Intent跳转到其他应用中的Activity时,如果系统找到了多个intent-filter与我们创建的Intent匹配,就会弹出对话框,列举所有匹配的Activity,让用户选择。比如我们的手机里如果安装了多款浏览器App,当我们点击一个URL时,会弹出一个对话框让我们选择使用哪个浏览器来打开这个网页,这就是因为跳转到浏览器Activity用的是隐式Intent;有些应用的Activity启动时需要接收数据,比如打电话Activity需要接收电话号码,也只能用隐式Intent
Activity跳转时,可以把数据封装在Intent中
Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("name", name); intent.putExtra("age", age); startActivity(intent);
Intent中可以封装的数据类型:八大基本数据类型和字符串以及它们的数组,还有实现了序列化接口的对象,还有Bundle对象。数据也可以先封装至Bundle,再把Bundle封装至Intent
在跳转到的目标Activity中取出数据
Intent intent = getIntent(); // 获取启动该Activity的Intent String name = intent.getStringExtra("name"); int age = intent.getIntExtra("age");
onCreate():创建Activity时被回调
onStart():在屏幕上可见,但是还没有获得焦点
onResume():可见并且获得焦点
onPause():可见,但是失去焦点
onStop():不可见
onDestroy():销毁时调用
onRestart():Activity从不可见变为可见时调用
按返回键,系统依次回调onPause()、onStop()、onDestroy(),Activity被销毁,进程还在;若再次进入该Activity,系统会依次回调onCreate()、onStart()、onResume(),Activity重新进入运行状态
按Home键,系统依次回调onPause()、onStop(),Activity进入停止状态,进程还在;若再次进入该Activity,系统会依次回调onRestart()、onStart()、onResume(),Activity重新进入运行状态
手机内存不足时,会杀死之前启动的进程,按照LRU(最近最少使用)算法锁定杀死哪个进程
每个应用有一个Activity Task栈,存放已启动的Activity。Activity的启动模式决定了Task栈的操作规则
standard:默认就是标准模式,每次通过这种模式来启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity实例添加到Task栈中
singleTop:Task栈顶单例模式,与标准模式仅有一点不同:当要启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activity的实例,而是直接复用已有的Activity实例
singleTask:Task栈内单例模式,采用这种启动模式的Activity在同一个Task栈内只能有一个实例。如果Activity没有被创建任何实例,那么启动时会创建并入栈;如果已经被创建了一个实例,那么启动时会返回(退栈)至该Activity
singleInstance:全局单例模式,采用这种启动模式的Activity在整个Android系统内存中只能有一个实例。如果将要启动的目标Activity不存在,系统会先创建一个全新的Task栈,再创建目标Activity的实例,并将他压入新的Task栈顶;如果将要启动的目标Activity已经存在,无论它位于哪个应用程序中、位于哪个Task栈中,系统都会把该Activity所在的Task栈转到前台,从而使该Activity显示出来。需要指出的是,采用singleInstance模式启动的Activity总是位于Task栈顶,且该Task栈中只有该Activity
默认情况横竖屏切换会使Activity销毁重建,触发生命周期方法重新执行
在一些特殊的应用程序中,比如游戏,不希望横竖屏切换导致Activity被销毁重建,如果不保存会丢失游戏数据
在清单文件中用以下代码让横竖屏切换时不重建Activity
android:configChanges="orientation|screenSize|keyboardHidden"
在清单文件中可用以下代码写死Activity的屏幕方向
android:screenOrientation="portrait" <!-- 竖屏--> android:screenOrientation="landscape" <!-- 横屏-->
在java文件中可用以下代码写死Activity的屏幕方向(会覆盖清单文件中的设置)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 竖屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // 横屏
指定请求码requestCode启动新的Activity
startActivityForResult(intent, requestCode);
在新的Activity中设置要返回的数据
Intent data = new Intent(); data.putExtra("tel", tel); setResult(resultCode, data); // 指定一个结果码resultCode,并把数据会返回给原Activity finish();
在原Activity里面实现方法
//通过data获取返回的数据 onActivityResult(int requestCode, int resultCode, Intent data) { }
通过判断请求码和结果码确定返回值data的作用
先通过请求码requestCode判断返回的data来自哪个Activity
再通过该Activity返回的结果码resultCode判断data中是该Activity所返回的哪一个数据
标签:
原文地址:http://www.cnblogs.com/eniac12/p/5596502.html