Activity官方直译深入理解(完结)


Activity

一个Activity是用户可以直观交互的东西。所有的activity都聚焦于创建一个窗口,可以通过setcontentview(view)的方式。通常情况下一个activity是全屏显示的,当然也可以设置不同的theme来显示不同的风格,例如windowIsFloating来设置浮动窗口。以下是每个activity必须回调的方法:

Oncreate 在此你可以初始化你的activity。通常情况下你会用布局文件setcontentview的方式来定义此activity。在程序中通过findViewById(int)来和布局中的控件进行交互。

Onpause 当用户离开你的activity时会回调此方法,通常情况下之前用户做的改变行为需在此提交。

在用Context.startActivity()启动之前,需要在AndroidManifest.xml通过<activity>声明。

Activity的生命周期

图片发自简书App

整个过程从Oncreate开始,ondestroy结束。用户可以见到activity时刻从onstart开始到onstop之前。我们可以在onstart里面注册BroadcastReceiver,以便收到广播后修改我们的ui, 在onstop里面取消我们的BroadcastReceiver。用户可以和activity交互的时候从onresume开始直到onpause,一个activity会经常在这两个生命周期切换,所以最好在这两个方法里做轻量级的操作。

你应该在你的子类中回调如下方法,以便在不同的时候处理不同的逻辑。

public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}

Note:如果一个activity的onpause方法不结束的话,当前的或另一个activity的onresume方法不会执行。


Configuration Changes

屏幕翻转,改变语言或者输入设备的改变,都会导致activity销毁。当然,我们可以在manifest.xml里面声明android:configChanges属性,在上述配置改变的时候交给我们自己的activity处理.将回调在这个方法里onConfigurationChanged(Configuration),如果在此方法中有些屏幕配置的改变没有处理到,那么activity还是会被销毁,如果是当前在栈顶的activity则会重建。


Starting Activities and Getting Results

通常情况下我们用startActivity(Intent)来启动一个新的activity,但有时我们想从新的activity结束的时候获取某些数据。比如微信打开相册选择某个图片发给联系人。此时就要用到startActivityForResult(Intent, int),int为请求码,将在稍后介绍。返回的结果将回调在原activity的onActivityResult(int, int, Intent)方法里。不同的int表示不同的情况,如结果返回成功与否。Android系统已帮我们做了定义(RESULT_CANCELED, RESULT_OK)。下面请看示例:见谅,实在不知道怎么在手机上调代码的格式

public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
// When the user center presses, let them pick a contact.
startActivityForResult(
new Intent(Intent.ACTION_PICK,
new Uri("content://contacts")),
PICK_CONTACT_REQUEST);
return true;
}
return false;
}
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == PICK_CONTACT_REQUEST) {
if (resultCode == RESULT_OK) {
// A contact was picked. Here we will just display it
// to the user.
startActivity(new Intent(Intent.ACTION_VIEW, data));
}
}
}


Permissions

启动一个Activity可能被拒绝,当在manifest里面没声明对应权限的时候。任何一个权限的生命周期(6.0需要特别的权限处理,百度android6.0权限封装)将持续到整个activity结束。


Process Lifecycle

Android系统会尽可能长的保留我们的应用进程,但是当内存不足的时候会移除最老的进程。通常情况下移除进程会和用户交互的activity类型有很大相关,以下列出了四种activity的类型(重要性从高到低):

1.foreground activity

用户正在交互的Activity,如你现在正在浏览的简书。它的进程只有在内存超出预期(由手机设备分配)才会被杀掉,通常来讲设备有责任保留它的进程。

2.visible activity

用户可见但不是foreground activity,比如此时弹出了一个对话框,一般来说不会被杀掉,除非为了保证foreground activity运行。

3.background activity

系统为前两种Activity预留内存会将此activity安全的杀掉。当用户重新返回这个activity时,oncreate方法会被回调,并会在onSaveInstanceState(Bundle)方法保存退出前的状态。

4.empty process

不再持有Activity或者是一个Service or BroadcastReceiver,系统在内存不足时有极大的可能性杀掉,所以我们在用service这种后台服务的时候,需要告诉系统我们的进程需要保留(通常做法是设置前台进程,弹出notification)。


Public method

1.addContentView(View view, ViewGroup.LayoutParams param)

添加一个可添加的布局

2.createPendingResult(int requestCode, Intent data, int flags)

创建一个PendingIntent的对象,并将处理结果返回到onActivityResult(int, int, Intent)。

3.dispatchTouchEvent(MotionEvent ev)

此方法在处理滑动冲突时极为有用,还有一个在子类中常用的方法view.getparent.requestdisallow(true)谁用谁知道。事件分发在很多大牛的文章已经有讲述了,小弟就不献丑了。

4.dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args)

打印Activity的状态到指定流

5.enterPictureInPictureMode()

让此Activity进入画中画模式,如果系统允许的话。现在主流直播可能就是此方法的衍生。

6.findViewById(int id)

从XML中解析出view对象

7.finish()

结束当前Activity,有人说此方法是不正常的结束方式,但看官方并无特别说明。

8.finishActivity(int requestCode)

强制关闭通过startActivityForResult(Intent, int)启动的activity。

9.finishAndRemoveTask()

结束一个Task里所有的activity。哟,难道能在主页调这个方法?

10.getApplication()

获取Activity唯一的application。如果是组件化项目不知道这个方式可不可用?

11.getCallingActivity()

超级有用的方法,通常我们做开发的,不知道当前页面是哪个activity,我们可以继承一个baseactivity,然后再回调oncreate的时候打印出当前的类名,这样我们就可以知道哪个页面对应哪个activity了。关于这个郭大神有一篇这个文章,后面我会贴出代码。

12.getCurrentFocus()

获得当前Window聚焦的具体view

13.getFragmentManager()

返回和当前Activity绑定的fragment的fragment manager

14.getIntent()

获得启动此Activity的intent

15.getLayoutInflater()

通过此方法直接解析一个布局成View

16.getReferrer()

谁启动了我?

17.getParentActivityIntent()

18.getRequestedOrientation()

当前请求的屏幕方向,注意用词,请求的,可能没请求成功

19.getSystemService(String name)

根据名字获得不同系统级的服务

20.isDestroyed()

回调的Ondestroy执行了,表示当前activity的实例已经死了

21.isFinishing()

调用Finish()后

22.isImmersive()

是否为沉侵模式,并且不能被通知打断

23.isInMultiWindowMode()

是否为多窗口模式

24.isInPictureInPictureMode()

是否为画中画模式

25.onAttachFragment(Fragment fragment)

回调此方法在Fragment.onAttach()后

26.onAttachedToWindow()

当前Activity的主window是否关联上了windowmanager

27.onBackPressed()

用户按了返回键

28.onKeyDown(int keyCode, KeyEvent event)

当有键被按下的时候,同时所有的子view没有处理的情况会回调

29.onLowMemory()

内存不足时回调,可在此释放一些资源,降低被系统回收的概率

30.onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)

请求的所有权限回调

31.onTouchEvent(MotionEvent event)

触摸事件,当子view没做处理的时候

32.overridePendingTransition(int enterAnim, int exitAnim)

在startActivity(Intent) or finish()后执行activity的切换动画。

33.recreate()

重新创建一个新实例

34.releaseInstance()

通知本地App叫它释放内存

35.runOnUiThread(Runnable action)

运行在UI线程,可在此更新一些界面显示

36.setIntent(Intent newIntent)

更新回调的getintent()

37.setVisible(boolean visible)

当前主Window是否可见



Protected methods

1.onActivityResult(int requestCode, int resultCode, Intent data)

接收启动的Activity结束时返回给它的一系列参数

2.onCreate(Bundle savedInstanceState)

3.onDestroy()

4.onNewIntent(Intent intent)

当启动模式为singleTop,在调用startActivity(Intent)时回调此方法

5.onpaues()

6.onPostCreate(Bundle savedInstanceState)

在onStart() and onRestoreInstanceState(Bundle)后调用,此方法用的少,但存在基友它的道理

7.onPostResume()

在Onresume后调用

8.onUserLeaveHint()

当用户选择进入后台时回调


Activity完

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容