美文网首页
activity一些知识点

activity一些知识点

作者: 纸狒 | 来源:发表于2019-06-21 12:34 被阅读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参数

    相关文章

      网友评论

          本文标题:activity一些知识点

          本文链接:https://www.haomeiwen.com/subject/yokyqctx.html