Activity复习
Activity是我们学习Android的时候的第一个组件,它提供界面用户可以进行滑动、点击等交互。使用上很简单,但是有一些相关的知识也许需要很好的掌握才能用好。
1. Activity生命周期
Activity的四种状态
- running: 活动状态,可以交互
- paused: 失去焦点,或者被盖住的情况下,无法进行交互
- stopped: Activity被完全覆盖的情况
- killed: Activity被系统回收。
生命周期
- oncreate:Activity被创建
- onStart:Activity被启动,可见,不可交互
- onResume:Activity可进行交互
- onPause:Activity停止状态,可见,不可交互
- onStop:Activity被停止,被覆盖,不可见
- onRestart:Activity被重启,从不可见到可见
- onDestory:Activity被销毁,可以进行资源回收
- Activity启动:oncreate()->onStart()->onResume()
- 点击Home键:onPause()->onStop()
- 再次回到Activity:onRestart()->onStart()->onResume()
- 退出Activity:onPause->onStop()->onDestory()
进程优先级
- 前台进程:前台交互的Activity或者前台Activity绑定的Service
- 可见进程:不可交互的进程
- 服务进程:后台的Service进程
- 后台进程:从前台切换到后台运行的进程
- 空进程:没有活跃的组件,随时可被回收
2. Android任务栈
Activity是存储在任务栈中的,它的特点是先进后出。这块跟Activity的启动模式相关比较紧密,同时,app在安全退出时,也需要遍历所有的Activity,都finish后再退出。
3. Activity启动模式
- standed:标准模式,每次启动Activity都会创建一个实例,并加入任务栈中,不会复用,比较消耗资源
- singleTop:栈顶复用模式,启动Activity的时候,会去判断,任务栈的栈顶是否是该Activity的实例,那么就不会再次创建,直接复用
- singleTask:栈内复用模式,启动Activity的时候,会去判断,任务栈中是否存在该Activity的实例,如果存在,它会将该实例上面部分所有activity实例出栈,把当前实例置于栈顶。
- singleInstance:在使用的过程中会有一些问题,很少使用,不多介绍。(Ps:在使用时出现过bug)
4. scheme跳转协议
在需要能够被打开的Activity中添加以下样例的intent-filter
<intent-filter>
<!--下面这几个必须要设置-->
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<!--协议部分-->
android:scheme="demo" android:host="dudu" android:path="/test" android:port="4002"
</intent-filter>
应用内跳转和app间跳转
构建intent,跳转
Uri uri = Uri.parse("demo://dudu:4002/test?name=张三&password=12345"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);
接收相关的uri和schme
需要结合启动模式,在onCreate或者newIntent中处理。
Intent intent = getIntent(); String scheme = intent.getScheme(); String dataString = intent.getDataString(); Uri uri = intent.getData(); System.out.println("scheme:" + scheme); if (uri != null) { //完整的url信息 String url = uri.toString(); //scheme部分 String schemes = uri.getScheme(); //host部分 String host = uri.getHost(); //port部分 int port = uri.getPort(); //访问路径 String path = uri.getPath(); //编码路径 String path1 = uri.getEncodedPath(); //query部分 String queryString = uri.getQuery(); //获取参数值 String name = uri.getQueryParameter("name"); String password = uri.getQueryParameter("password"); }
url启动app
<a href="demo://dudu:4002/test?name=张三&password=12345">test</a>
js跳转页面
需要重写WebView,拦截url进行Intent的拼装,跳转。