- 浏览: 85253 次
- 性别:
- 来自: 福建
文章分类
- 全部博客 (64)
- android (28)
- androidApp (1)
- GphonePlay (0)
- [随笔分类][00]JavaScript (2)
- [随笔分类][01]Spring (3)
- [随笔分类][02]Hibernate (4)
- [随笔分类][03]EXT (4)
- [随笔分类][04]项目工程 (0)
- [随笔分类][06]数据库 (1)
- [随笔分类][07]软件使用 (5)
- [随笔分类][09]Ophone (1)
- [随笔分类][08]SSH整合 (3)
- [随笔分类][13]生活随笔 (1)
- [随笔分类][15]架构与设计 (2)
- [随笔分类][16]Weekly Updates (0)
- [随笔分类][17]自我提高 (2)
- [随笔分类][18]中间件 (1)
- [随笔分类][20]测试 Debug Junit (1)
- [随笔分类][21]软件工程 (1)
- [随笔分类][22]团队合作与管理 (1)
最新评论
-
lcyaiym:
不错 ,我正在研究这个问题了。
使用Intent Filter来响应隐式Intent -
qiaoweishu:
精辟深刻,很是受益!
软件开发的精益理念 -
qiaoweishu:
吟安一个字,捏断数径须!受教了!
怎样成为优秀的软件模型设计者 -
lnx1824:
先巩固现有的j2ee,过段时间再来学习!
android HelloWord -
gryphone:
似乎并不存在实际上的匿名 其实系统也是按照对应的string ...
Android如何解析Intent Filter
发现当前Android的资料不是很多,而且对于Activity的介绍也很少,所以把官方文档的android.app.Activity的介绍翻译了一下,加入了一些自己的理解。各位如果觉得我自己理解的不对,请无视。欢迎邮件讨论。
android.app
public class
android.app.Activity
android.app.ApplicationContext ViewInflate.Factory
android.app.Activity KeyEvent.Callback Window.Callback
Activity 是用户唯一可以看得到的东西。几乎所有的activity都与用户进行交互,所以Activity主要负责的就是创建显示窗口,你可以在这些窗口里使用setContentView(View)来显示你自己的UI。activity展现在用户面前的经常是全屏窗口,你也可以将activity作为浮动窗口来使用(使用设置了windowIsFloating的主题),或者嵌入到其他的activity(使用ActivityGroup)中。下面是两个几乎所有Activity的子类都实现了的方法。
onCreate(Bundle) 这个方法是初始化 activity的地方. 最重要的是,你经常需要在这里使用setContentView(int) 来设置UI布局所使用的layout资源, 当你需要使用程序控制UI中的组件时可以使用 findViewById(int) 来获得对应的视图。
当用户离开activity时你可以在onPause() 进行相应的操作. 更重要的是,用户做的任何改变都应该在该点上提交 (经常提交到 ContentProvider 这里保存数据)。
如果要使用 Context.startActivity()来启动activity, activity都必须在启动者应用包的AndroidManifest.xml
文件中
有对应的 <activity> 定义。
Activity类是 application's overall lifecycle 的一个重要部分。
这里涉及到的主题:
Activity 生命周期
系统中的Activity可以通过一个activity栈来进行管理。当一个新的activity启动的时候,它首先会被放置在activity栈顶部并成为running状态的activity —— 之前的activity也在activity栈中,但总是被保存在它的下边,只有当这个新的activity退出以后之前的activity才能重新回到前景界面。
所有的activity本质上有四种状态:
- activity在屏幕的前景中(activity栈的顶端),它是active或者running状态。
- activity失去了焦点但是仍然可见(这个activity顶上遮挡了一个透明的或者非全屏的activity),它的状态是paused。一个paused状态的activity完全是alive的(它维护自己所有的状态和成员信息,而且仍然在window manager的管理中),但当系统内存极度贫乏时也会将其killed。
- activity由于其他的activity而完全变暗,它就进入了stopped状态。它仍然保持着所有的状态和成员的信息,可是,他对于用户来说不可见,当别的地方需要内存的时候它经常会被killed。
- activity是paused或者stopped,系统需要将其清理出内存的时可以命令其finish或者简单kill其进程。当它重新在用户面前显示的时候,它必须完全重新启动并且将其关闭之前的状态全部恢复回来。
下面的图表是Activity的状态图,直角矩形代表了callback方法,你可以实现这些方法从而使Activity在改变状态的时候执行你制定的操作。带颜色的椭圆形是Activity的主要状态。
这里有三个比较关键的生命周期。
- 从最初调用onCreate(Bundle)到最终调用onDestroy()称为完整生命周期。Activity会在onCreate()进行所有“全局”状态的设置,在onDestroy()中释放所有持有的资源。举个例子,如果它有一个从网络上下载数据的后台线程,那他可能就会在onCreate()中创建这个线程并在onDestroy()中停止这个线程。
- 从activity调用onStart()开始,到调用对应的onStop()为止称为可见生命周期。在这段时间内用户可以在屏幕上看到这个activity,尽管并不一定是在前景也不一定可以和用户交互。在这两个方法之间你可以维护那些activity在用户显示时所需的资源。举个例子来说,你可以在onStart()中注册一个IntentReceiver来监控那些可以对你的UI产生影响的环境改变,当你的UI不继续在用户面前显示时你可以在onStop()中注销这个IntentReceiver。每当activity在用户面前显示或者隐藏时都会调用相应的方法,所以onStart()和onStop()方法在整个生命周期中可以多次被调用。
- 从activity调用onResume()开始,到调用对应的onPause()为止称为前景生命周期,这段时间activity处于其他所有activity的前面,且与用户交互。一个activity可以经常在resumed和paused状态之间转换——例如手机进入休眠时、activity的结果返回时、新的intent到来时——所以这两个方法中的代码应该非常的简短。
下面的Activity方法定义了activity完整的生命周期。他们全都是hook方法,你可以重载这些方法从而使activity在状态改变时执行你所期望的操作。所有activity都应该实现自己的onCreate(Bundle)方法来进行初始化设置;大部分还应该实现onPause()方法提交数据的修改并且准备终止与用户的交互。尽管我们计划在系统中添加更多的工具来管理应用,现在大多activity仍需要实现onFreeze()并且在onCreate(Bundle)中执行对应的状态恢复。其他的方法可以在需要时进行实现,当实现这些方法的时候需要注意的是一定要调用父类中的对应方法。
public class Activity extends ApplicationContext {
protected void onCreate(Bundle icicle);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onFreeze(Bundle outIcicle);
protected void onPause();
protected void onStop();
protected void onDestroy();
}
一般来说activity的生命周期变化看起来比较象下面的表格:
(此处译者进行了大块的修改,请参考原文阅读下面表格)
方法 |
描述 |
Killable? |
下一方法 |
|
Activity初次创建时被调用,你应该在这里进行一般的静态设置:创建view、将数据绑定到list等等。如果activity之前存在冻结状态,那么此状态将在Bundle中提供。 如果activity首次创建,本方法后将会调用onStart(),如果activity是停止后重新显示,则将调用onRestart()。 |
No |
|
||
|
当activity对用户即将可见的时候调用。 其后调用onRestart()或onResume()(框架是否进行选择性调用onResume()仅仅是猜测) |
No |
|
|
当activity从停止状态重新启动时调用。其后调用onResume()。 |
No |
|
||
|
当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经可以传递给它。 如果其他的activity在它的上方恢复显示,则将调用onFreeze()。 |
No |
|
|
当你的activity被暂停而其他的activity恢复与用户交互的时候这个方法会被调用(在其他activity显示之前),你可以使用这个方法保存你当前的用户状态(一般来说是当前实例的用户状态)。暂停之后,为了回收资源供给前景activity,系统会在需要的时间停止(或者kill)你的应用。以后如果你的activity启动一个新的实例重新与用户进行交互,你保存在这里的状态都将通过onCreate()方法传递给新的实例。 其后总是调用onPause()方法。 |
No |
|
||
当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占用CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。 如果activity重新回到前景时将调用onResume(), 如果对用户彻底不可见则会调用onStop()。 |
Yes |
|
||
当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。 当activity重新回到前景与用户交互时调用onRestart(),如果activity将退出则调用onDestory()。 |
Yes |
|
||
在你的activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况(对activity直接调用finish()方法或者系统为了节省空间而临时销毁此activity的实例,你可以通过isFinishing()的返回值来区分这两种情况)。 |
Yes |
nothing |
①: 这个表格本人觉得还有些值得商榷的地方,建议作为参考阅读,不管是原文还是译文。
注意上表中“Killable”这一列 —— 对于那些标记killable的方法,当这些方法结束后,activity的进程可能在任何时间被系统kill而不再执行activity中的任何代码。因此你应该利用onFreeze()(保存你当前UI的状态)和onPause()(将所有的修改写回持久存储),这样activity才能在被kill的时候正确的保存当前的状态。如果需要了解一个进程的生命周期与他所执行的activity之间的关系 参见 进程生命周期 部分。
对于那些标记killable的方法,从这些方法启动开始直到返回之前,activity的进程都不回被系统kill。举个例子,一个activity在onPause()方法返回后处于killable的状态,这种状态会一直持续到onResume()方法开始执行。
配置改变
如果设备的配置(在Resources.Configuration中进行了定义)发生改变,那么所有用户界面上的东西都需要进行更新,以适应新的配置。因为Activity是与用户交互的最主要的机制,它包含了处理配置改变的专门支持。
除非你特殊指定,否则当配置发生改变(比如屏幕方向、语言、输入设备等等的改变)时你当前的activity都将被销毁,这销毁是通过一个正常的activity生命周期过程(onFreeze(Bundle), onPause(), onStop(), 和 onDestroy())进行的。如果activity之前正在前景画面,当这个实例的onDestroy()调用完成后将会启动这个activity的一个新的实例,并将前面那个实例中onFreeze(Bundle)所保存的内容传递给新的实例。
因为任何的应用资源(包括layout文件)都有可能由于任何配置值而改变。因此处理配置改变的唯一安全的方法就是重新获取所有的资源,包括layout、绘图资源(原文drawables)、字符串资源。由于activity已经如何保存自己的状态并从这些状态中重建自身,所以activity重新启动自身来获得新的配置将是一个非常便利的途径。
在一些特殊的情况中,你可能希望当一种或者多种配置改变时避免重新启动你的activity。你可以通过在manifest中设置android:configChanges属性来实现这点。你可以在这里声明activity可以处理的任何配置改变,当这些配置改变时不会重新启动activity,而会调用activity的onConfigurationChanged(Resources.Configuration)方法。如果改变的配置中包含了你所无法处理的配置(在android:configChanges并未声明),你的activity仍然要被重新启动,而onConfigurationChanged(Resources.Configuration)将不会被调用。
启动Activity并获得结果
startActivity(Intent)方法可以用来启动一个新的activity,这个activity将被放置在activity栈的栈顶。这个方法只有一个参数Intent,这个参数描述了将被执行的activity。
有时候你希望在一个activity结束时得到它返回的结果。举个例子,你可能启动一个activity来让用户从通讯簿中选择一个人;当它结束的时候将会返回这个所选择的人。为了得到这个返回的信息,你可以使用startSubActivity(Intent, int)这个方法来启动新的activity,第二个整形参数将会作为这次调用的识别标记。这个activity返回的结果你可以通过onActivityResult(int, int, String, Bundle)方法来获得,此方法的第一个参数就是之前调用所使用的识别标记。
当activity退出的时候,它可以调用setResult(int)来将数据返回给他的父进程。这个方法必须提供一个结果码,这个结果码可以使标准结果RESULT_CANCELED, RESULT_OK,也可以是其他任何从RESULT_FIRST_USER开始的自定义值。此外,它还可以返回一段字符串(经常是一段数据的URL地址),一个包含它所有希望值的Bundle。这些信息都会在父activity的回调函数Activity.onActivityResult()
中出现,并连同最初提供的识别标记一起(此处有些拗口,意思其实就是子activity返回的内容、返回码、识别标记都将作为参数,按照不同的返回情况来调用父activity的Activity.onActivityResult()方法,以实现出现各种返回时父activity做出响应的处理)。
如果子activity由于某种情况发生失败(例如crashing),父activity将会收到RESULT_CANCELED结果码。
这里是一个例子,说明了如何启动一个新的activity并处理结果。
public class CalendarActivity extends Activity {
...
static final int DAY_VIEW_MODE = 0;
static final int WEEK_VIEW_MODE = 1;
private SharedPreferences mPrefs;
private int mCurViewMode;
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
SharedPreferences mPrefs = getSharedPreferences();
mCurViewMode = mPrefs.getInt("view_mode" DAY_VIEW_MODE);
}
protected void onPause() {
super.onPause();
SharedPreferences.Editor ed = mPrefs.edit();
ed.putInt("view_mode", mCurViewMode);
ed.commit();
}
}
许可
你可以通过在Activity所属应用的manifest文件中对应的<activity>标签中进行
声明来限制哪些应用可以启动此Activity。如果你进行了声明,其它应用需要在他们
自己的manifest文件中声明对应的<uses-permission>元素(而且需要在安装时
被授予许可:译者注)才可以启动这个activity。
如果需要了解更多有关于一般安全机制和许可方面的信息可以参考Security Model。
进程生命周期
Android系统会尽量久的保留应用进程。但是当内存降低时最终还是要移除旧的进程。就像Activity 生命周期 中描述的一样,移除哪个进程还是要取决于关联的用户与之交互的程度。一般来说,进程可以基于其中运行的activity所处的生命周期而分成四种状态,下面将这些状态根据重要程度排列。系统会在kill更重要的进程(第一个)之前首先kill那些不那么重要的进程(最后一个)。
前景activity(处于屏幕最上方,用户与之交互的activity)被认为是最重要的。如果设备上的内存无法满足它的使用,Kill此进程只能作为最后的手段。一般来说这个时候设备处于内存paging状态,为了
使用户界面保持响应才会发出这个kill请求。
可见activity(一个对用户可见,但是不在前景的activity,比如处在浮动对话框后)被认为是非常重要的,除非为了保证前景activity运行,否则不会被kill。
后台activity(一个对用户不可见,并处于paused状态的activity)就不再重要了,所以当需要为其它前景的或者可见的activity运行而回收内存时系统可以很安全的kill它们。
空进程是一个没有运行activity或者其他应用组件(比如Service或者IntentReceiver类)的进程。当内存开始降低时系统很快就会kill掉这些进程。因此当你要在activity外运行任何的后台操作时,必须在IntentReceiver或Service的上下文环境中运行,这样系统才知道需要将你的进程保留而不是kill。
有些时候Activity可能需要长时间运行一个操作,且它并不依赖于activity的生命周期而存在。例如一个照相机应用可能允许你将照片上传到web站点。上传可能需要很长时间,在上传过程中应该允许用户离开这个应用。为了做到这一点,你的activity应该在上传时启动一个Service来执行此工作。这将使系统在你的进程上传数据的过程中能够恰当的区分它的优先级(认为此进程比其他不可见应用更重要),不管原来的activity的状态是paused、stopped还是finished。
marshal.hird@gmail.com
发表评论
-
Android如何解析Intent Filter
2009-08-23 19:31 2233匿名性质的运行时绑定 ... -
使用Intent Filter来响应隐式Intent
2009-08-23 19:14 4047如果一个Intent请求在一片数据上执行一个动作,Androi ... -
Linkify介绍
2009-08-23 17:21 3389Linkify是一个辅助类,通过RegEx样式匹配,自动地在T ... -
动态更新菜单项与处理菜单选择
2009-08-23 15:55 1513public boolean onOptionsItemS ... -
菜单项选项
2009-08-23 15:35 1262正如你所熟悉的那样,Android支持大多数传统的菜单项选项, ... -
Android菜单系统介绍
2009-08-23 15:09 1573如果你曾经尝试用手写 ... -
Layouts介绍
2009-08-23 15:05 1357Layout管理器(一般称“layouts”)是ViewGro ... -
实时改变配置
2009-08-23 15:03 1031Android通过终止、重启应用程序来重新加载资源文件,以做到 ... -
使用系统资源
2009-08-23 15:00 907Android本体应用程序具体 ... -
在资源中引用资源
2009-08-23 14:59 832在资源中引用资源 你可以在其他XML资源中通过特性来引 ... -
在代码中使用资源
2009-08-23 14:58 1210在代码中使用资源 你可以在代码中通过R静态类使用资源 ... -
Animations
2009-08-23 14:55 923Animations Android支持2种类型的动画 ... -
Layouts
2009-08-23 14:53 826Layouts Layout资源是通过在XML中设计U ... -
Styles和Themes
2009-08-23 14:51 731Styles和Themes 通过指定Views的特性值 ... -
Drawables
2009-08-23 14:50 1084Drawables Drawable资源包括位 ... -
Values
2009-08-23 14:46 1343<?xml version=”1.0” encoding ... -
资源具体化
2009-08-23 14:44 783不管你使用什么开发环境,一个良好的习惯就是保存非代码的资源(像 ... -
理解应用程序优先级和进程状态
2009-08-23 14:43 1044杀死哪个进程来回收资源由进程中的应用程序的优先级决定的。应用程 ... -
使用Manifest Editor
2009-08-23 14:42 1047ADT插件程序包含了一个可视化的Manifest Editor ... -
应用程序Manifest介绍
2009-08-23 14:30 1496每一个 Androi ...
相关推荐
开发android的简单程序并且为android的开发打下基础,很希望得到源代码的
《Apress.Learn.Android.Studio.3.Efficient.Android.App.Development.2018》是一本关于使用Android Studio 3高效开发Android应用程序的专业指南。这本书深入浅出地介绍了如何利用Android Studio 3这一强大的集成...
标题中的“android_app_NativeActivity.rar_NativeActivity_android”表明我们正在探讨与Android应用开发相关的主题,特别是涉及到NativeActivity。NativeActivity是Android系统提供的一种特殊类型的Activity,允许...
//这里将Context转换为Activity. mActivity = (Activity)mContext; LayoutInflater inflater = LayoutInflater.from(mContext); View v = inflater.inflate(R.layout.main, null); addView(v); ...
import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import ...
Fragment是Android应用程序中可重用的UI组件,它可以独立于Activity存在。在TabLayout的场景中,每个Tab通常会对应一个Fragment,用于展示不同的内容。这样可以保持Activity的简洁性,同时使得代码更加模块化。 ...
import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import ...
在Android开发中,`appWidget` 是一种可以在用户主屏幕上显示的小部件,它提供了一种无需打开应用程序就能与用户交互的方式。本篇文章将深入探讨如何使用`appWidget`来启动一个`Activity`。 首先,我们需要了解`app...
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import ...
我们知道Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框、PopupWindow也有相应的WindowManager窗体管理器。因为对话框、PopupWindown不能脱离Activity而单独存在着,...
此外,`android.support.v7.app`包中的`AlertDialog`、`DatePickerDialog`和`TimePickerDialog`等对话框,以及`NotificationCompat`类,提供了对早期Android版本的通知兼容性,使得开发者可以创建与最新API级别设备...
集成邮件工具类,用于发送某个应用的奔溃日志信息到邮箱。当用户发生奔溃信息的时候可以及时查看log 2018-01-31-19-14-51 ----java.lang.RuntimeException: Unable to start activity ComponentInfo{...
本文将详细介绍Android AppWidget的使用方法,并提供一个示例程序来帮助理解。 首先,AppWidget的构成主要包含以下几个部分: 1. **AppWidgetProvider**: 这是Android的BroadcastReceiver子类,用于接收和处理与...
下面将详细介绍`TabLayout`的使用方法和关键知识点。 1. **安装依赖** 在项目的`build.gradle`(Module级别)文件中添加`design`库依赖: ```groovy dependencies { implementation '...
当我们谈论"展示当前app所处的最顶activity"时,我们通常是在讨论如何获取或显示用户当前正在使用的Activity信息。 Android系统中的Activity管理遵循“后进先出”(Last In First Out, LIFO)的原则,就像一个栈...
首先,Native Activity是Android系统框架的一部分,由Android的libnative_activity.so库支持。它提供了一个接口,将Android的事件循环和UI更新与本地代码关联起来。在创建Native Activity时,需要定义一个Android的...
它继承自`android.app.Activity`,并且添加了许多与Material Design相关的功能,比如颜色主题、ToolBar、动画效果等。 `Theme.AppCompat.Light.NoActionBar`是一个预定义的主题,它基于`Theme.AppCompat.Light`,并...
import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Build; import ...
import android.app.AlertDialog; import android.app.Dialog; import android.app.TabActivity; import android.content.DialogInterface; import android.graphics.Color; import android.os.Bundle; import ...
完全可以用的 一键root 工具 安全可用,本人测试过。