androidactivity(androidactivity movetoback)

本篇文章给大家谈谈androidactivity,以及androidactivity movetoback对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Android之Activity全面解析,有些知识点容易忘记

Activity作为安卓四大组件之一,是最重要也是用得最多的组件,涉及的知识点非常多,有些知识点平时开发很少用到,但在某些场景下需要特别注意,本文详细整理了Activity涉及的知识点,供开发参考。

针对Activity可以提出很多问题,如:

Activity 的生命周期?

Activity 之间的通信方式?

Activity 各种情况下的生命周期?

横竖屏切换时 Activity 的生命周期?

前台切换到后台,然后再回到前台时 Activity 的生命周期?

弹出 Dialog 的时候按 Home 键时 Activity 的生命周期?

两个Activity之间跳转时的生命周期?

下拉状态栏时 Activity 的生命周期?

Activity 与 Fragment 之间生命周期比较?

Activity 的四种 LaunchMode(启动模式)的区别?

Activity 状态保存与恢复?

Activity的转场动画有哪些实现方式?

Activity的生命周期中怎么获取控件宽高?

onNewIntent的执行时机?

如何连续退闭此出多个Activity?

如何把Acitivty设置成Dialog样式 ,android:theme="@android:style/Theme.Dialog"

关于横竖屏切换的生命周期,对应不同的手机,由于厂商定制的原因,会有不同的效果,如设置了configChanges="orientation”在有些手机会执行各个生命周期,但有些手机却不会执行。

网上常见的结论如下:

但实际的测试如下:

可以看出,不同厂商的手机切屏生命周期会有差异。

从API 13以上,当设备在横竖切屏时,“屏幕尺寸”也会发生变化,因此为了杜绝切屏导致页面销毁重建,需要加上screenSize,使用设置4,即 android:configChanges="orientation|keyboardHidden|screenSize" .

Activity的四种状态如下:

在activity处于paused或者stoped状态下,如果系统内存紧张,可能会被销毁,当重回该activity时会重建,正常返回和被回收后返回的生命周期如下:

如果是回收后返回,onCreate的参数savedInstanceState不为空。

有哪些场景会触发onNewIntent回调呢?跟启动模式有关,首先该Activity实例已经存在,再次启动才可能触发。一种情况是启动模式是singleTask或者singleInstance,无论该activity在栈中哪个位置,都会触发onNewIntent回调,并且把上面其他acitivity移除,另一种情况是启动模式是singleTop或者以FLAG_ACTIVITY_SINGLE_TOP启动,并且该activity实例在栈顶,会触发onNewIntent,如果不在栈顶是重新创建蠢态友的,不会触发。

在实际业务开发中,往往碰到需要连续退出多个activity实例,下面整理了几种常见方法:

● 发送特定广播

1、在需要处理连续退出的activity注册该特定广播;

2、发带槐起退出的activity发送该特定广播;

3、接收到该广播的activity 调用finish结束页面。

● 递归退出

1、用startActivityForResult启动新的activity;

2、前一个页面finish时,触发onActvityResult回调,再根据requestCode和resultCode处理是否finish,达到递归退出的效果。

● FLAG_ACTIVITY_CLEAR_TOP

通过intent.setFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP)启动新activity,如果栈中已经有该实例,则会把该activity之上的所有activity关闭,达到singleTop启动模式的效果。

● 自定义activity栈

1、自定义activity列表,新打开activity则加入栈中,关闭则移除栈;

2、需要退出多个activity时,则循环从栈中移除activity实例,并调用finish。

在讨论Activity启动模式经常提到任务栈,那到底什么是任务栈?

任务是一个Activity的集合,它使用栈的方式来管理其中的Activity,这个栈又被称为返回栈(back stack),栈中Activity的顺序就是按照它们被打开的顺序依次存放的。返回栈是一个典型的后进先出(last in, first out)的数据结构。下图通过时间线的方式非常清晰地向我们展示了多个Activity在返回栈当中的状态变化:

taskAffinity 任务相关性,可以用于指定一个Activity更加愿意依附于哪一个任务,在默认情况下,同一个应用程序中的所有Activity都具有相同的affinity, 名字为应用的包名。当然了,我们可以为每个 Activity 都单独指定 taskAffinity 属性(不与包名相同)。taskAffinity 属性主要和 singleTask 启动模式和 allowTaskReparenting 属性配对使用,在其他情况下没有意义。

taskAffinity 有下面两种应用场景:

分为显示启动和隐式启动。

(1)显示启动

直接指定待调整的Activity类名。

(2)隐式启动

Intent 能够匹配目标组件的 IntentFilter 中所设置的过滤信息,如果不匹配将无法启动目标 Activity。IntentFilter 的过滤信息有 action、category、data。

IntentFilter 需要注意的地方有以下:

● 一个 Activity 中可以有多个 intent-filter

● 一个 intent-filter 同时可以有多个 action、category、data

● 一个 Intent 只要能匹配任何一组 intent-filter 即可启动对应 Activity

● 新建的 Activity 必须加上以下这句,代表能够接收隐式调用

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

只要匹配一个action即可跳转,注意的是action要区分大小写。

规则:如果intent中有category,则所有的都能匹配到intent-filter中的category,intent中的category数量可用少于intent-filter中的。另外,单独设置category是无法匹配activity的,因为category属性是一个执行Action的附加信息。

intent不添加category会匹配默认的,即 “android:intent.category.DEFAULT”

如果上面例子,如果去掉intent.setAction("action_name"),则会抛出异常:

规则:类似action,但data有复杂的结构,只要匹配一个data并且与data中所有属性都一致就能匹配到Activity,只要有1个属性不匹配,都无法找到activity。

data的结构:

data 主要是由 URI 和 mimeType 组成的。

URI 可配置很多信息,的结构如下:

与url类似,例如:

mineType:指资源类型包括文本、图片、音视频等等,例如:text/plain、 image/jpeg、video/* 等

下面看下data匹配的例子:

只匹配scheme

只匹配scheme也是能匹配到activity的。

匹配scheme、host、port

将上面的data改为

匹配mineType

如果有mineType,则不能仅设置setData或setMineType了,因为setData会把mineType置为null,而setMineType会把data置为null,导致永远无法匹配到activity,要使用setDataAndType。

使用scheme的默认值content\file

注意该方法需要在startAtivity方法或者是finish方法调用之后立即执行,不能延迟,但可以在子线程执行。

而在windowAnimationStyle中存在四种动画:

activityOpenEnterAnimation // 打开新的Activity并进入新的Activity展示的动画

activityOpenExitAnimation // 打开新的Activity并销毁之前的Activity展示的动画

activityCloseEnterAnimation //关闭当前Activity进入上一个Activity展示的动画

activityCloseExitAnimation // 关闭当前Activity时展示的动画

overridePendingTransition的方式比较生硬,方法也比较老旧了,不适用于MD风格,google提供了新的转场动画ActivityOptions,并提供了兼容包ActivityOptionsCompat。

我们知道在onCreate和onResume里面直接获取到控件宽高为0,那有什么办法获取到控件的实际宽高?只要有onWindowFocusChanged、view.post、ViewTreeObserver三种方式获取。

当用户点击桌面图标启动APP时,背后的流程如下:

我们看到的手机桌面是Launch程序的界面,点击应用图标会触发点击事件,调用startActivity(intent),然后通过Binder IPC机制,与ActivityManagerService(AMS)通讯,AMS执行一系列操作,最终启动目前应用,大概流程如下:

通过PackageManager的resolveIntent()收集跳转intent对象的指向信息,然后通过grantUriPermissionLocked()方法来验证用户是否有足够的权限去调用该intent对象指向的Activity。如果有权限,则在新的task中启动目标activity,如果发现没有进程,则先创建进程。

如果进程不存在,AMS会调用startProcessLocked创建新的进程,在该方法中,会通过socket的通讯方式通知zygote进程孵化新的进程并返回pid,在新的进程中会初始化ActivityThread,并依次调用Looper.prepareLoop()和Looper.loop()来开启消息循环。

创建好进程后下一步要将Application和进程绑定起来,AMS会调用上一节创建的ActivityThread对象的bindAppliction方法完成绑定工作,该方法会发送一条BIND_APPLICATION的消息,最终会调用handleBindApplication方法处理消息,并调用makeApplication方法处理消息,加载APP的classes到内存中。

通过前面的步骤,系统已经拥有了该Application的进程,后续的启动则是从已存在其他进程中启动Acitivity,即调用realStartAcitvityLocked,该方法会调用Application的主线程对象ActivityThread的sheduleLaunchActivity方法,在方法中会发送LAUNCH_ACTIVITY到消息队列,最终通过handleLaunchActivity处理消息,完成Acitivty的启动。

Activity

Activity 的 36 大难点,你会几个?「建议收藏」

[译]Android Application启动流程分析

android activity的关闭处理的几种方式

项目中我们往往要用到关闭程序时销毁所有的activity,而且这也是面试经常遇到的问题,退出程序的方式也有好几种,一下是一些处理关闭程序的方法:

1.最简单的方式就是使用系统的方法exit(0),这丛启是最简单粗暴的方式,强制程序退出,但是这种方法针对尘郑租部分机型有可能不太好使,退出时有可能出现程序崩溃的弹出框,或者程序会重新启动,这对用户体验来说不是很好。

2.抛出异常强制退出,这种方法的使用对用户体验来说简直就是灾难,所以就不要用这种方式了。

3.使用广播的方式通知activity进行关闭,这种方式也有人在用,大家可以自行百度下,我主要介绍下面这种方式。

4.使用application,在application中创建activity集合,创建添加以及删除activity的方法,并且在BaseActivity中的生命周期中调用这些方法,在使用的时候调用BaseApplication的方法,这也是目前最常用的方法,但是这种在BaseActivity中添加activity的方法也有一个问题,那就是当你要使用第三方的BaseActivity的时候,一个还好你可以继承,那如果要使用两个第三方的BaseActivity呢, Java 本身是单继承的,所以就会导致activity关闭不全了。那么这个问题的解决就要依靠一接口: ActivityLifecycleCallbacks ;这是Application中声明的一个接口,其内容如下:

@Override

public voidonActivityCreated(Activity activity,Bundle bundle) {

Log.e("onActivityCreated---","is running"+"--"+activity.getLocalClassName());

}

@Override

public voidonActivityStarted(Activity activity) {

Log.e("onActivityStarted---","is running"+"--"+activity.getClass().getCanonicalName());}

@Override

public voidonActivityResumed(Activity activity) { Log.e("onActivityResumed---","is running"+"--"+activity.getClass().getCanonicalName());}

@Override

public voidonActivityPaused(Activity activity) { Log.e("onActivityPaused---","is running"+"--"+activity.getClass().getCanonicalName());}

@Override

public voidonActivityStopped(Activity activity) { Log.e("onActivityStopped---","is running"+"--"+activity.getClass().getCanonicalName() );}

@Override

public voidonActivitySaveInstanceState(Activity activity,Bundle bundle) { Log.e("onActivitySaveInstanceState---","is running"+"--"+activity.getPackageName());}

@Override

public voidonActivityDestroyed(Activity activity) { Log.e("onActivityDestroyed---","is running"+"--"+activity.getPackageName());}

大派兆家可以看到这些方法名采用的都是英语中的过去式命名,其意大家看方法名也应该懂了,就是activity执行过得生命周期都会在这里调用,想要这些方法执行要调用

registerActivityLifecycleCallbacks(this);

这个方法,记得一定要调用啊,还有请记住这些回调是针对所有的Activity哦,所以我们就可以使用这样的方式去对activity进行关闭或者其他操作了。下面有一种存放activity的方式,喜欢的可以使用:

private staticWeakReferencecurAct;

private staticWeakHashMapacList=newWeakHashMap();

/***设置当前activity**

@paramact*/

public static voidsetCurActivity(Activity act) {curAct=newWeakReference(act);acList.put(act, null);}

/***获取想要的activity*@return*/

public staticActivitygetCurActivity() {if(acList==null||acList.isEmpty())return null;WeakReference wr =curAct;if(wr !=null) {returnwr.get();}return null;}

/***清理activity*@paramact*/

public static voidclearCurActivity(Activity act) { Object remove =acList.remove(act);if(remove !=null TextUtils .equals(remove.getClass().getSimpleName(),curAct.get().getClass().getSimpleName())) {//TODO You want to do something.}}/***销毁所有的activity*/public static voiddestroyAllActivity() {if(null!=acList !acList.isEmpty()) { Object[] keys =acList.keySet().toArray();for(Object obj : keys) { Activity act = (Activity)obj;if(act !=null) { act.finish();} } }}

/***关闭某个activity*@paramactivity*/

public static voidcloseActivity(String activity) {if(null!=acList !acList.isEmpty()) { Object[] keys =acList.keySet().toArray();for(Object obj : keys) {if(obj !=null activity !=null TextUtils.equals(obj.getClass().getSimpleName(),activity)) { Activity act = (Activity)obj;act.finish();} } }}

下面是CSDN地址: 原文链接

[img]

Android基础之Activity生命周期

     Activity是Android最常用的四大组件之一,Activity是Android应用中与用户交互的界面,通常一个activity就是一个屏幕,Activity一共有四种状态,Active/Running(当Activity可见且可以与用户交互);Paused(当Activity可见但是不可交互);Stoped(当Activity被完全覆盖不可见);Killed(当Activity被系统从内存中删除).其生命周期如下图:

相关方法及作用:

1 onCreate:当Activity创建时仅且调用一次,该方法主要适用于初始化页面。

2 onStart:当Activity调用onCreate方法之后,然后调用此方法开启Activity,Activty此时可见但不可交互。

3 onResume:此时Activity在前台可见且可与用户交互。适合做UI更新操作。

4 onPouse:当Activity被另外一个Activity覆盖时调用该方法。

5 onStop:当Activity在前台不可见或者Activity在销毁前调用此方法,此方法适合做一些资源的回收操作。

6 onDestroy:当activity被销毁时调用此方法。

问题:

1)onCreate 和 onStart 方法的区别

  a.执行次数磨闹雀不同,onCreate只执行一次,而onStart可以执行多次。

  b.在弯坦activity的状态不同,onCreate被调用时Activity的状态还是未可见,而调用onStart时已可见。

2) onStart 和 onStop的区别

  在执行onStart或者onStop时,Activity都是不可交互的,执行onStart时Activity在前台不可见,在后台可见。而执行onStop时Activity前后台都不可见。

3)onResume 和 onPouse的区别

  在执行onResume时,Activity在前台是可见的且可以与用户交互的。而执行onPouse时Activity在前台有可能可见,Activity没有获取到焦点,此时不可与用瞎早户交互。

Android四大组件 —— Activity(窗口)

Activity是一个 界面 的载体,可以把它与html页面进行类比,html页面由各种各样的标签组成,而Activity则可以由 各种控件 组成。

Activity的掌握重点主要在于:

     a.Activity的生命周期 

     b.Activity的启动模式

              onCreate() : 

            当Activity第一次被创建的时候调用此方法.一般在此方法中 进行控件的声肆橘明,添加事件等初始化工作 .

            onStart():

            当Activity被显示到屏幕上的时候调用此方法,执行完此方法后 界面可见

            onResume():

            当此Activity能够被操作之前,也就是能够获得用户的焦点之前调用此方法.

            onRestart():

            当Activity被停止后又被再次启动之前调用此方法.接着将调用onStart()方法.

            onPause():

            当第一个Activity通过Intent启动第二个Activity的时候,将调用第一个Activity的onPause()方法.然后调用空雹灶第二个Activity的onCreate(),onStart(),onResume()方法,接着调用第一个Activity的onStop()方法.如果Activity重新获得焦点,则将调用onResume()方法;如果此Activity进入用户不可见状态,那么将调用onStop()方法.

            onStop():

            当第一个Activity被第二个Activity完全覆盖,或者被销毁的时候回调用此方法.如果此Activity还会与用户斗扮进行交互,将调用onRestart方法();如果此Activity将被销毁,那么将调用onDestroy()方法.

            注意:

              a.home键返回,锁屏,关闭界面肯定会调用onStop方法

              b.但是开启另一个Activity并不一定会调用onStop方法

            onDestroy():

               Activity被销毁之前调用此方法.或者是调用finish()方法结束Activity的时候调用此方法.可以在此方法中进行收尾工作,比如释放资源等.

             Active/Runing 一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。

             Paused  当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。

             Stoped  当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于  Stop ed 状态。

             Killed  Activity 被系统杀死回收或者没有被启动时处于  Killed 状态。

            在 manifest 文件中声明 activity 时,利用activity元素的 launchMode 属性来设定 activity 与 task 的关系。

launchMode 属性 指明了 activity 启动 task 的方式,默认 standard方式

             standard(默认模式):

          系统在启动 activity 的 task 中创建一个新的 activity 实例,并把 intent 传送路径指向它。 该 activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中也可以存在多个实例。

             singleTop:

           如果 activity 已经存在一个实例并位于当前 task 的 栈顶 ,则系统会调用已有实例的 onNewIntent() 方法把 intent 传递给已有实例,而不是创建一个新的 activity 实例。activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中可以存在多个实例(但仅当 back stack 顶的 activity 实例不是该 activity 的)。

               singleTask:

            系统将创建一个新的 task,并把 activity 实例 作为根 放入其中。但是,如果 activity 已经在其它 task 中存在实例,则系统会通过调用其实例的onNewIntent() 方法把 intent 传给已有实例,而不是再创建一个新实例。 此 activity 同一时刻只能存在一个实例。

            例如:可以用于关闭所有Activity或重新登录等

             singleInstance:

            除了系统不会把其它 activity 放入当前实例所在的 task 之外,其它均与"singleTask"相同。activity 总是它所在 task 的唯一成员;它所启动的任何 activity 都会放入其它 task 中

            主要是startActivity(intent),或者带值返回startActivityForResult(intent) , Activity的跳转方式  。

关于androidactivity和androidactivity movetoback的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表