导航:首页 > 操作系统 > androidactivity休眠

androidactivity休眠

发布时间:2022-12-19 09:12:20

① 请问,如何使安卓软件中的Activity在后台以及关闭屏幕后能继续运行

实现activity后台运行有两种方法:

方法一:

添加下列代码即可:

java">Intentintent=newIntent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

方法二:

此方法其实不是主要是屏蔽Keycode_Back,让它不结束(finish())Activity,直接显示HOME界面。

PackageManagerpm=getPackageManager();
ResolveInfohomeInfo=pm.resolveActivity(newIntent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_HOME),0);
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if(keyCode==KeyEvent.KEYCODE_BACK){
ActivityInfoai=homeInfo.activityInfo;
IntentstartIntent=newIntent(Intent.ACTION_MAIN);
startIntent.addCategory(Intent.CATEGORY_LAUNCHER);
startIntent.setComponent(newComponentName(ai.packageName,
ai.name));
startActivitySafely(startIntent);
returntrue;
}else
returnsuper.onKeyDown(keyCode,event);
}
voidstartActivitySafely(Intentintent){
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try{
startActivity(intent);
}catch(ActivityNotFoundExceptione){
Toast.makeText(this,R.string.unabletoopensoftware,
Toast.LENGTH_SHORT).show();
}catch(SecurityExceptione){
Toast.makeText(this,R.string.unabletoopensoftware,
Toast.LENGTH_SHORT).show();
Log
.e(
TAG,
""
+intent
+".MakesuretocreateaMAINintent-"
+".",
e);
}
}

android Activity生命周期解析

Activity 用户可以做单一的、集中的事情。几乎所有的Activity都与用户进行交互,所以Activity类负责创建一个窗口,你可以通过调用setContentView(View)把你的UI布局放置在Activity的窗口中。作为四大组件之一,使用频率非常高。深入了解Activity,对于我们高质量开发是很有帮助的,下面我们就来看看Activity的生命周期。

Android系统中是通过Activity栈的方式来管理Activity的,而Activity自身则是通过生命周期的方法来管理的自己的创建与销毁。那么我们就来看看Activity生命周期是怎样运作的。

周期即活动从开始到结束所经历的各种状态。生命周期即活动从开始到结束所经历的各个状态。从一个状态到另一个状态的转变,从无到有再到无,这样一个过程中所经历的状态就叫做生命周期。

Acitivity本质上有四种状态:

在上面的四中常有的状态之间,还有着其他的生命周期来作为不同状态之间的过度,用于在不同的状态之间进行转换。

我们先来看看下面这张经典的生命周期流程图:

1)启动Activity
onCreate() —> onStart() —> onResume()
2)按Home键回到桌面 / 锁屏
onPause() —> onStop()
3)从桌面回到Activity / 解锁
onRestart() —> onStart() —> onResume()
4)跳转新Activity
A: onPause() —> onStop()
B: onCreate() —> onStart() —> onResume()
A —> B: onPause()_A —> onCreate()_B —> onStart()_B —> onResume()_B —> onStop()_A
5)返回上一个Activity
B: onPause() —> onStop() —> onDestroy()
A: onRestart() —> onStart() —> onResume()
B —> A: onPause()_B —> onRestart()_A —> onStart()_A —> onResume()_A —> onStop()_B —> onDestroy()_B
6)退出Activity
onPause() —> onStop() —> onDestroy()

Activity官方文档,开启传送门

至此Activity的整个生命周期都介绍完了,现在我们再看之前的生命周期流程图,是不是清晰许多。搞清楚Activity活动原理,这样理解起来就会容易许多,工作中也能如鱼得水。

③ 安卓开发activity怎么在主线程中sleep

在onCreate()或onResume()方法里直接调用Thread.sleep(1000)就可以。这里1000表示1秒。

不过这样做很容易导致app停止响应,即ANR。

④ 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 (Activity activity,Bundle bundle) { Log.e("onActivitySaveInstanceState---","is running"+"--"+activity.getPackageName());}

@Override

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

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

(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地址: 原文链接

⑤ 简述 activity 和 service 的生命周期有什么不同

组件的生命周期

用程序组件都有一个生命周期,从响应Intent的Android实例开始到这个实例被销毁。在这期间,他们或许有效或许无效,有效时或许对用户可见或许
不可见。下面我们就来讨论四个基本组件的生命周期,包括在生命周期内的各种状态,以及状态之间的转换。这几种状态可能的结果是:进程让他们停止,
然后实例被销毁。

一、activity生命周期

一个activity有三个基本的状态:

@ 当activity在前台运行时(在activity当前任务的堆栈顶),为活动或者运行状态。这时activity会响应用户的操作。

@

当activity失去焦点但是对用户仍然可见时为paused暂停状态。此时,别的activity在他的上面,透明或者备有被全部覆盖。所以其中一些
暂停的activity也可以被显示。一个暂停的activity是处于活动状态的(他维护着所有的状态保存着信息,并且依然附着在窗口管理器)。

@ 如果一个activity完全被另一个activity所掩盖那他会处于stop状态。但仍然保存着原来的状态和信息。然而,如果别的地方需要更多的内存而且这个activity仍一直处于隐藏状态,那么系统有可能会杀死他的进程。

如果一个activity是暂停或者停止状态,系统可以清理他们占用的内存,或者调用finish()方法,或者直接结束他的进程。当他再次显示给用户时,会完全的重新运行并且加载以前所存储的信息。

activity状态之间的转换,是通过以前的受保护方法完成的:

void onCreate(Bundle savedInstanceState)

void onStart()

void onRestart()

void onResume()

void onPause()

void onStop()

void onDestroy()

这些都是钩子函数,你可以重写他们,当状态改变时做一些适当的处理。所有的activity在首次运行时必须实现onCreate()方法来初始化安装。activity可以实现onPause()来提交数据改变,然后准备停止与用户的交互。

调用超类

每一个实现的activity生命周期方法都会先调用一下父类的方法,例如:

view plain to clipboardprint?

protected void onPause() {

super.onPause();

. . .

}

protected void onPause() {

super.onPause();

. . .

}

通过这两者比较?,这7个方法定义了一个activity的整个生命周期的方法。你可以实现并且监测这三个嵌套循环:

@ 整个生命周期


用onCreate()方法和onDestroy()之间称为一个activity的完整的生命周期。activity会在onCreate()里执行所
有的初始化安装,在onDestroy()方法里释放所有的剩余资源。例如:一个从网络下载程序的线程,就需要在onCreate()方法里创建,在
onDestroy()方法里销毁。

@ 可见生命周期


见生命周期是从onStart()方法到onStop()方法的时间。这段时间,用户会在屏幕上看到这个activity。尽管他可能不是在最顶层显示,
也没有和用户进行任何交互。这两个方法之间,你可以保持需要向用户显示的资源。例如:你可以在onStart()方法时注册一个
BroadcastReceiver检测某些变化来改变你的界面,当用户看不到这个activity的界面时可以在onStop()里注销这个
BroadcastReceiver。这两个方法可以被调用很多次,在可见和对用户隐藏时,作为候补的activity待命。

@ 前台显示周期


个activity从onResume()方法指导一个onPause()方法称为前台显示周期。此时他在其他的activity之上显示并且与用户交
互。一个activity可以频繁的在这两个方法之间过度,例如:当设备休眠或者另一个新的activity启动时,它会进入onPause()状态,当
一个activity运行结束或者新的接收到Intent请求时,activity的onResume()会被调用。因此,这两个方法里的代码量会很
少。

下图说明了上面说的几个循环,里面的箭头说明了两个状态之间是否可以相互转换。有色的椭圆是activity主要的几个状态。正方形和长方形代表activity在状态之间转变时我们可以实现的一些回调方法。


意killable这列,它指明了进程在调用方法返回后是否可以被系统杀死,而不执行其他的代码。onPause(), onStop(), and
onDestroy()这三个方法可以,因为onPause方法首先被执行,他是唯一一个一定会被调用的方法当进程被杀死时,但是onStop()和
onDestroy()方法不会。因此,你可以在onPause()方法里保存一些连续的数据,例如编辑。

killable
这列被标记成no的方法,保护activity防止他们被调用时,被进程杀死。例如:一个activity是处于可被杀死的状态,当activity从
onPause()方法跳转到onResume()方法时,在OnPause方法回调之前是不会被杀死的。

正如后面的章节:进程和生命周期,一个没有定义为“killable”的activity仍然可以被系统结束,但这时会发生在特殊情况下,比如没有其他资源时。

保存activity的状态

当系统(而不是用户)关闭一个activity来节省内存时,用户希望再次启动activity时会回到当时的状态。


了在activity被杀死之前捕获他的状态,你可以实现
onSaveInstanceState()方法,Android会在一个activity将要被关闭时调用这个方法,也就是在onPause()方法之
前。他回传递给方法一个Bandle对象,你可以用key-value的方式保存你的数据。当activity再次运行时。这个Bandle对象会传递给
onCreate()方法、onStart()方法、onRestoreInstanceState()方法。这几个方法都能重建当时的activity
状态。


像onPause()和刚才讨论的其他几个方法,onSaveInstanceState()和onRestoreInstanceState()方法不
是生命周期方法。不是不是总被调用。例如:Android在activity将要被系统销毁之前调用onSaveInstanceState()方法,当
activity实例被用户的操作销毁时(例如按下Back键),是不会调用这个方法的。这种情况下没有理由保存他的状态。

Coordinating activities

当一个activity启动了另一个activity,他们都经历了生命周期的转换。一个暂停了或者结束了,其他的activity启动。一种情况你可能需要调节这些activity:

生命周期方法的回调顺序都是定义好的,尤其当两个activity在同一进程下:

1.当前运行的activity的onPause()方法被调用。

2.然后将要运行的activity的onCreate()、onStart()、onResume()方法被依次调用。

3.然后,如果将要运行的activity不太可见,那么onstop()方法会被调用。

二、Service的生命周期:

有了 Service 类我们如何启动他呢,有两种方法:

• Context.startService()

• Context.bindService()

1. 在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的
onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到
Context.stopService() 或者 selfStop() 方法被调用。另外如果一个 Service 已经被启动,其他代码再试图调用
startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。

2. 另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service
的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后
Service 会回调上边提到的 onBind() 方发,你可以从这里返回一个实现了 IBind
接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service
还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。

总结:

1. startService()的目的是回调onStart()方法,onCreate()
方法是在Service不存在的时候调用的,如果Service存在(例如之前调用了bindService,那么Service的onCreate方法
已经调用了)那么startService()将跳过onCreate() 方法。

2.
bindService()目的是回调onBind()方法,它的作用是在Service和调用者之间建立一个桥梁,并不负责更多的工作(例如一个
Service需要连接服务器的操作),一般使用bindService来绑定到一个现有的Service(即通过StartService启动的服
务)。

由于Service 的onStart()方法只有在startService()启动Service的情况下才调用,故使用onStart()的时候要注意这点。

与 Service 通信并且让它持续运行

如果我们想保持和 Service 的通信,又不想让 Service 随着 Activity 退出而退出呢?你可以先
startService() 然后再 bindService() 。当你不需要绑定的时候就执行 unbindService()
方法,执行这个方法只会触发 Service 的 onUnbind() 而不会把这个 Service 销毁。这样就可以既保持和 Service
的通信,也不会随着 Activity 销毁而销毁了。

提高 Service 优先级

Android
系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运信,系统内部会自动分配,控制程序的内存使用。当系统觉得当前的资源非常有限的时候,为了保
证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存。这样就能保证真正对用户有用的程序仍然再运行。如果你的
Service 碰上了这种情况,多半会先被杀掉。但如果你增加 Service 的优先级就能让他多留一会,我们可以用
setForeground(true) 来设置 Service 的优先级。

为什么是 foreground ? 默认启动的 Service 是被标记为 background,当前运行的 Activity 一般被标记为
foreground,也就是说你给 Service 设置了 foreground 那么他就和正在运行的 Activity
类似优先级得到了一定的提高。当让这并不能保证你得 Service 永远不被杀掉,只是提高了他的优先级。

三、android的service的生命周期与activity类似,但是有一些不同:

onCreate和onStart是不同的


过从客户端调用Context.startService(Intent)方法我们可以启动一个服务。如果这个服务还没有运行,Android将启动它并
且在onCreate方法之后调用它的onStart方法。如果这个服务已经在运行,那么它的onStart方法将被新的Intent再次调用。所以对于
单个运行的Service它的onStart方法被反复调用是完全可能的并且是很正常的。

onResume、onPause以及onStop是不需要的

回调一个服务通常是没有用户界面的,所以我们也就不需要onPause、onResume或者onStop方法了。无论何时一个运行中的Service它总是在后台运行。

onBind


果一个客户端需要持久的连接到一个服务,那么他可以调用Context.bindService方法。如果这个服务没有运行方法将通过调用
onCreate方法去创建这个服务但并不调用onStart方法来启动它。相反,onBind方法将被客户端的Intent调用,并且它返回一个
IBind对象以便客户端稍后可以调用这个服务。同一服务被客户端同时启动和绑定是很正常的。

onDestroy


Activity一样,当一个服务被结束是onDestroy方法将会被调用。当没有客户端启动或绑定到一个服务时Android将终结这个服务。与很多
Activity时的情况一样,当内存很低的时候Android也可能会终结一个服务。如果这种情况发生,Android也可能在内存够用的时候尝试启动
被终止的服务,所以你的服务必须为重启持久保存信息,并且最好在onStart方法内来做。

--------------------------------------------------------------------------------------------------

activity的生命周期

oncreate(Bundle
savedInstanceState):在activity第一次被创建的时候调用。这里是你做所有初始化设置的地方──创建视图、绑定数据至列表等。
如果曾经有状态记录,则调用此方法时会传入一个包含着此activity以前状态的包对象做为参数

onRestart():在activity停止后,在再次启动之前被调用。

onStart():当activity正要变得为用户所见时被调用。

onResume():在activity开始与用户进行交互之前被调用。此时activity位于堆栈顶部,并接受用户输入。

onPause():当系统将要启动另一个activity时调用。此方法主要用来将未保存的变化进行持久化,停止类似动画这样耗费CPU的动作等。这一切动作应该在短时间内完成,因为下一个activity必须等到此方法返回后才会继续。

onStop():当activity不再为用户可见时调用此方法。这可能发生在它被销毁或者另一个activity(可能是现存的或者是新的)回到运行状态并覆盖了它。

onDestroy():在activity销毁前调用。这是activity接收的最后一个调用。这可能发生在activity结束(调用了它的 finish() 方法)或者因为系统需要空间所以临时的销毁了此acitivity的实例时。你可以用isFinishing() 方法来区分这两种情况。

协调activity

当一个activity启动了另外一个的时候,它们都会经历生命周期变化。一个会暂停乃至停止,而另一个则启动。这种情况下,你可能需要协调好这些activity:

生命周期回调顺序是已经定义好的,尤其是在两个activity在同一个进程内的情况下:

1. 调用当前activity的 onPause() 方法。

2. 接着,顺序调用新启动activity的onCreate()、 onStart()和onResume()方法。

3. 然后,如果启动的activity不再于屏幕上可见,则调用它的onStop()方法。

总之:1、Activity 从创建到进入运行态所触发的事件 onCreate()-->onStart-->onResume()

2、从运行态到停止态所触发的事件 onPause()--->onStop()

3、从停止态到运行态所触发事件 onRestart()-->onStart()--->onResume()

4、从运行态到暂停态所触发事件 onPause()

5、从暂停态到运行态所触发事件 onResume()

横竖屏幕切换生命周期

1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次.

2.设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次.

3.设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法.

service的生命周期

启动Service时可调用startService和bindService()方法来启动,用这两种方法启动的Service的生命周期是不同的。

Service的生命周期只有onCreate,onStart和onDestroy,没有onResume,onPause和onStop,大多
数时间Service都是运行的,但在严重的内存压力下它也可能被系统kill,如果被kill,系统会在稍后尝试重新启动这个Service

Service的调用

途径一:
调用Context.startService()启动Service,调用Context.stopService()或Service.stopSelf()或Service.stopSelfResult()关闭Service的调用。

Service生命周期分析:
注:onCreate,onStart(),onDestroy()是Service生命周期相关的方法

当Context.startService()启动Service时,如果Service本身没有运行,则调用
onCreate()->onStart()完成Service启动。如果Service已经运行,则只调用
onStart(),onStart()可以多次被调用。
Service关闭必须调用Context.stopService()或Service.stopSelf()或
Service.stopSelfResult()方法,关闭之前调用onDestroy()方法,否则如果Context直接退出而没有停止
Service的话,Service会一直在后台运行。该Service的调用者只能再启动后通过stopService关闭Service。
生命周期顺序为:onCreate()->onStart()->onDestroy()

途径二:
调用Context.bindService()进行初始化绑定,使用Context.unbindService()取消绑定,由于Service和Context是绑定关系,当Context退出或被销毁时,Service也会相应退出。

Service生命周期分析:
调用Context.bindService()时,Service会经历onCreate->onBind(),onBind将返回给客户端一个
IBind实例,IBind允许客户端回调服务的方法。此时Context和Service是绑定在一起的,Context退出了,Service调用
onUnbind()->onDestroy()相应退出。
生命周期顺序为:onCreate->onBind(只一次,不可多次绑定)->onUnbind->onDestroy()

BroadcastReceiver只能通过startService启动Service,因为广播本身生命周期很短,bind的话没有意义

果不是通过bindService创建的服务(但仍然通过bindService得到了服务对象),就可能unbindService后还在运行,否则应该是结束掉了。

⑥ android中怎样让main线程和子线程同步一个变量

1、检查Thread,确定没有在Background thread中直接调用adapter,如果有,请移除相关代码到Handler中处理;
2、尽量将数据放在adapter类中管理,不需要的时候清除信息(勤写clear()),及时用notifyDataSetChanged()刷新;
3、在Activity或者Fragment合适的位置(onPause/onStop)要及时检查thread,有adapter数据处理相关的应马上停止;
4、这个错误经常出现在Activity休眠起来之后,主要还是使用adapter不太小心造成的。如果实在找不到原因,在onPause()函数中停止所有的background thread,并且在onResume()函数最前面清空adapter中的数据,并且adapter.notifyDataSetChanged()。然后重新更新加载数据,这样一般可以解决问题。

⑦ 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的默认值contentfile

注意该方法需要在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的sheleLaunchActivity方法,在方法中会发送LAUNCH_ACTIVITY到消息队列,最终通过handleLaunchActivity处理消息,完成Acitivty的启动。

Activity
Activity 的 36 大难点,你会几个?“建议收藏”
[译]Android Application启动流程分析

⑧ android中 进入到下一个activity时 不销毁前一个怎么做

进入休眠状态。

Activity 有几个状态。。。。跳转时,设置成休眠即可。

具体你网络下~~
我也忘记了 很长时间没有高了

⑨ 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的生命周期

一、基础

1.1自己创建的activity必须要继承类Activity(或其子类)。在activity里,为了实现activity各种状态的切换,你必须实现指定的回调方法。以下是最为重要的两个回调方法

onCreate():

这是必须实现的回调方法,启动一个 activity时会首先调用此方法。因此,在onCreate()的方法体里,你应该初始化该activity必要的控件。值得注意的是,在这里你必须调用setContentView(View view)方法去呈现用户的界面。

onPause():

在用户将要离开activity时调用此方法(指的是此时activity处于半透明状态且没有获取用户的焦点)。通常在这样的状态下,你需要处理用户数据的提交、动画处理等操作。

1.2销毁activity

你可以调用finish()方法去销毁一个activity。同样得,你可以调用finishActivity()方法去销毁一个你刚刚启动的activity。

tips:

在多数情况下,你是不需要显式地调用finish…()方法去销毁一个activity。在将要讨论到的activity生命周期里,你可以知道,Android系统会为你管理activity的生命周期,所以你并不需要显式销毁activity(即调用finish类方法)。显式地调用finish类方法,会对用户的体验产生不利的影响,除非你确实是不希望用户返回到此activity(界面),才去显式调用finish类方法。

二、认识activity的生命周期

2、1

Activity的生命周期对它的任务、backstack和与此有关联的activity有着直接的影响。因此想开发出一个健壮的有弹性的Android程序,你需要学会如何去管理activity的生命周期(即调用各种回调方法)。

activity的生命周期主要包含一些三种状态:

(1)运行态(Resumedstate)

此时Activity程序显示在屏幕前台,并且具有焦点,可以与用户的操作进行交互,如向用户提供信息、捕获用户单击按钮的事件并做处理。

(2)暂停态(PausedState)

此时Activity程序失去了焦点,并被其他处于运行态的otherActivity取代在屏幕显示,但otherActivity程序并没有覆盖整个屏幕或者具有半透明的效果—此状态即为暂停态。处于暂停态的Activity仍然对用户可见,并且是完全存活的(此时Activity对象存留在内存里,保留着所有状态与成员信息并保持与窗口管理器的连接)。如果系统处于内存不足的情况下,会杀死这个Activity。

(3)停止态(StoppedState)

当Activity完全被另一个otherActivity覆盖时(此时otherActivity显示在屏幕前台),则处于停止态。处于停滞态的Activity依然是存活的(此时Activity对象依然存留在内存里,保留着所有的状态和与成员信息,但没有与窗口管理器保持连接),而且它对用户是不可见的,如果其他地方需要内存,系统会销毁这个Activity。

处于暂停态(PausedState)或者停止态(Stopped
State)的Activity,系统可以通过调用finish()方法或者直接终止它的进程来销毁此Activity(从内存中清楚此Activity对象)。被finish()或者销毁的Activity再重新打开时,是需要再次初始化此Activity的。

2、2

当一个Activity从一种状态转到另一种状态时,会通过调用回调方法来通知这种变化。这些回调方法都是可以重写的,你可以根据程序的的需要来选择重写对应的回调方法。以下列出了Activity生命周期里的基本回调方法:

public class ExampleActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// The activity is being created.

}

@Override

protected void onStart() {

super.onStart();

// The activity is about to become visible.

}

@Override

protected void onResume() {

super.onResume();

// The activity has become visible (it is now
"resumed").

}

@Override

protected void onPause() {

super.onPause();

// Another activity is taking focus (this activity is
about to be "paused").

}

@Override

protected void onStop() {

super.onStop();

// The activity is no longer visible (it is now
"stopped")

}

@Override

protected void onDestroy() {

super.onDestroy();

// The activity is about to be destroyed.

}

}

笔记:在方法体里,必须先调用父类对应的实现方法super.Xxx(),再执行其他的操作(如上面代码所示)。为了习惯,下面也提供一些代码来测试一些这些方法的使用,在博客的最后面。

总的来说,这些回调方法定义了Activity整个生命周期。在生命周期里通过重写这些回调方法,,你可以监控以下下三个嵌套的方法循环。

完整存活的时间:

Activity的完整存活的时间是自第一次调用onCreate()开始,直至调用onDestroy()为止。Activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。例如,如果Activity有一个线程在后台运行从网络下载数据,它会在onCreate()创建线程,而在 onDestroy()销毁线程。

可见状态的时间:

Activity的可见状态是自onStart()调用开始直到相应的onStop()调用结束。在此期间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台或者也不与用户进行交互。在这两个方法之间,我们可以保留用来向用户显示这个Activity所需的资源。例如,当用户不再看见我们显示的内容时,我们可以在onStart()中注册一个BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注消。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。

显示在前台的时间:

Activity的前台显示是自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并与用户进行交互。Activity会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新的Activity启动时,将调用onPause() 方法。当Activity获得结果或者接收到新的Intent时会调用onResume() 方法。

阅读全文

与androidactivity休眠相关的资料

热点内容
无线已加密不可上网是怎么了 浏览:464
什么app可以免费做手机 浏览:373
异性下载什么app 浏览:680
51单片机程序单步视频 浏览:239
家庭宽带如何连接服务器 浏览:117
汽车高压泵解压 浏览:770
上门正骨用什么app 浏览:758
安卓为什么免费使用 浏览:397
加密货币都有哪些平台 浏览:625
python和matlab难度 浏览:388
python爬虫很难学么 浏览:572
小米解压积木可以组成什么呢 浏览:816
为什么滴滴出行app还能用 浏览:564
怎么升级手机android 浏览:924
php权威编程pdf 浏览:996
扣扣加密技巧 浏览:722
苹果如何创建服务器错误 浏览:497
软考初级程序员大题分值 浏览:475
js压缩视频文件 浏览:580
linux如何通过命令创建文件 浏览:991