Activity官方直译深入理解(完结)
Activity一个Activity是用户可以直观交互的东西。所有的activity都聚焦于创建一个窗口,可以通过setcontentview(view)的方式。通常情况下一个activity是全屏显示的,当然也可以设置不同的theme来显示不同的风格,例如windowIsFloating来设置浮动窗口。以下是每个activity必须回调的方法:
Oncreate 在此你可以初始化你的activity。通常情况下你会用布局文件setcontentview的方式来定义此activity。在程序中通过findViewById(int)来和布局中的控件进行交互。 Onpause 当用户离开你的activity时会回调此方法,通常情况下之前用户做的改变行为需在此提交。 在用Context.startActivity()启动之前,需要在AndroidManifest.xml通过声明。
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)。
【Activity官方直译深入理解(完结)】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完
推荐阅读
- ts泛型使用举例
- Unity和Android通信系列文章2——扩展UnityPlayerActivity
- 星际无限|星际无限 | 官方推出Filecoin MinerX奖学金计划,吸引中小型Filecoin矿工
- 1040表格和W-2表格
- 世界脑力锦标赛官方公布2018年世界记忆大师新评定标准!
- vue的cli用法
- Jdbi3官方教程(二)|Jdbi3官方教程(二) 入门
- RxSwift官方实例八(UITableVIew)
- elasticsearch分析器
- Jdbi3官方教程(三)|Jdbi3官方教程(三) Jdbi和Handle