开发者社区> 青楼艾小生> 正文

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

简介: Activity 一个Activity是用户可以直观交互的东西。所有的activity都聚焦于创建一个窗口,可以通过setcontentview(view)的方式。
+关注继续查看

Activity

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

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

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

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

Activity的生命周期

img_0861913975a197c753928d46743785b0.png
图片发自简书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完结,以后将开始service的直译

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
18615 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
18665 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
9065 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
21539 0
使用SSH远程登录阿里云ECS服务器
远程连接服务器以及配置环境
12457 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
13819 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
17034 0
+关注
青楼艾小生
喜欢coding的普普通通标标准准程序员
57
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载