activity一些知识点

2019-06-21  本文已影响0人  纸狒

概括内容主要包括:

         1,生命周期;

         2,启动方式;

         3,scheme跳转协议

   activity的定义:

          安卓提供显示用户交互的接口,提供了一个界面供用户进行点击,各种滑动操作,这就是activity的意义。


                                1,activity的生命周期

1.    activity的四种状态

2.   activity生命周期分析

3.    android进程优先级


1.1,activity的四种状态:

                                 running  /  paused  /  stopped  /   killed

running:运行中,即活动状态下,进行操作,且activity处于activity栈顶

paused:失去焦点的状态:情况:被一个非全屏的activity或者全透明的activity覆盖

stopped:被一个activity完全覆盖时,会处于stopped状态,不再可见,内存或成员变量可能还在

Killed:失去交互能力,但是成员变量都还在,处于内存紧张时会被系统回收掉


1.2,activity的生命周期分析

1.2.1,activity的生命周期

生命周期图

onCreate()

onStart():处于用户可见,但还没有进入前台显示,即用户还不能进行点击,滑动(未交互动)

onPause()

onResume()前台可见,用户可操作(交互),也可初始化资源

onRestart()

onStop()

onDestroy()

场景例子:

1,点击Home键回到主界面(activity不可见) ->  onPause()   ->  onStop()

     这里的onPause():activity处于可见,但是不可触摸的状态

     这里的onStop():处于activity完全被覆盖的状态

2,当我们再次回到原来的activity时 -> onRestart() -> onStart() -> onResume()

     表示正在重新由不可见到可见状态

3,当退出当前activity时 -> onPause() ->  onStop() ->  onDestroy()


1.3,进程优先级

   进程优先级如下:

                                          前台  /  可见  /  服务  /  后台  /  空

                                                     从左到右,优先级从高到低

前台进程:

1,处于前台与用户交互的activity;

2,在前台绑定的Service;

3,进程的BroadcastRecevier在执行onReceive()

可见进程:可见不可触

服务进程:后台开启的服务

       正在运行已使用startService() 方法启动的服务且不属于和上述两个更高类别进程的进程。尽管服务进程与用户所见内容没有直接关联,但它们通常在「执行一些用户关心的操作」(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维护所有前台进程和可见进程同时运行,否则会让服务进程保持运行状态。

后台进程:场景描述:我们点击了Home键,前台可交互的activity,此时就变成了后台进程,会不会被kill,要看具体的内存情况,紧张就会被kill

空进程:

1,不属于前四种;

2,保持活跃;

3,随时被杀掉;

4,保持这个进程的原因是,它可以作为一个cache来提高下次启动组件的速度

空进程的定义:

      不含任意活动应用组件的进程。保留这种进程的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。


                               2,activity的启动模式

standard:默认的启动模式,每点击一个就创建一个新的activity资源

singleTop:栈顶复用,即如果创建的activity是处于栈顶,则不会再创建,会复用,但是如果没有,就会再创建一个

使用场景:用于详情页,可以省去资源,因为你快速点击深层activity,会不断地创建实例,最后会容易引起内存资源不足导致闪退的现象。

singleTask:栈内复用,即如果activity任务栈中存在这个activity,就将它置于栈顶,然后把它上面的那些清除掉

使用场景:

另外,如果登陆页是app启动后的第一页,如下一样

    <activity

           android:name=".ui.activity.LoginWebActivity"

           android:launchMode="singleTask"

            android:screenOrientation="portrait"

           android:windowSoftInputMode="stateHidden|adjustPan">

          <intent-filter>

                  <action  android:name="android.intent.action.MAIN"/>

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

          </intent-filter>

</activity>

    如果启动页配置了SingleTask,你点了home后再打开应用,显示的还会是启动页

     如果启动页没有配置该模式,则点了home后再打开应用,显示的是上一次你出来的页面

     由此它可以应用于安全级别较高的app的一些登录的使用场景中。

     毕竟因为onCreate()不会再走了,所以就要走下面的。

     以上两个启动模式可以用onNewIntent()方法进行回调和调整。

singleInstance:有且只有一个实例,独占一个任务栈


                               3,scheme跳转协议

意义:

              是页面内跳转的协议,是一种非常好的实现机制。

             通过定义自己的scheme协议,可以非常方便地跳转app中的各个页面;

             通过scheme协议,服务器可以定制化告诉app跳转到哪个页面;

             可以通过通知栏消息定制化跳转页面;

             可以通过H5页面跳转页面

模式简介:

           可以由A这个app ->  BApp

           可以指定从A  acitivity - > B activity

关于URL,URI,Uri

URL:通用的资源定位符,用于定位,读写资源

URI:通用的资源标识符,只能进行定位资源

Uri:结构,在Android中使用Uri,每种资源,图,video,都可用Uri

                                                          URI>URL

模拟点击链接中的参数(使用场景在别的APP中调起别的APP)

实例:

A应用部分

/**

*(1)在manifest配置文件中配置了scheme参数

*(2)网络端获取url

*(3)跳转

*/

Stringurl="scheme://mtime/goodsDetail?goodsId=10011003";

Intentintent=newIntent(Intent.ACTION_VIEW,

Uri.parse(url));

startActivity(intent);

B应用部分

       android:name=".schemeActivity"

       android:label="@string/app_name">

<!--要想在别的App上能成功调起App,必须添加intent过滤器-->

<!--协议部分,随便设置-->

<intent-filter>

<!--协议部分,随便设置-->

<data android:scheme="scheme"android:host="mtime"android:path="/goodsDetail"/>

<!--下面这几行也必须得设置-->

<category  android:name="android.intent.category.DEFAULT"/>

<action android:name="android.intent.action.VIEW"/>

<category android:name="android.intent.category.BROWSABLE"/>

</intent-filter>

</activity>

B应用的Activity中

Protected  void  onCreate(@Nullable  Bundle savedInstanceState){

          super.onCreate(savedInstanceState);

         setContentView(R.layout.layout_shceme);

           schemeTv=(TextView)findViewById(R.id.text1);

          Uridata=getIntent().getData();

    Log.i(TAG,"host="+data.getHost()+"path="+data.getPath()+"query="+data.getQuery());

         Stringparam=data.getQueryParameter("goodsId");

           schemeTv.setText("获取的参数为:"+param);

}

效果就是:

点击跳转

A应用的界面,点击helloword跳转 跳转到B应用界面

跳转到另一个应用的页面

A应用    ---->(跳转)--->      B应用

A应用:网络端获取url,用Intent跳转。

B应用:配置文件中配置scheme参数

上一篇 下一篇

猜你喜欢

热点阅读