AndroidManifest.xml
- 为应用的 Java 软件包命名。软件包名称充当应用的唯一标识符。
- 描述应用的各个组件,包括构成应用的 Activity、服务、广播接收器和内容提供者。它还为实现每个组件的类命名并发布其功能,例如它们可以处理的
Intent
消息。这些声明向 Android 系统告知有关组件以及可以启动这些组件的条件的信息。 - 确定托管应用组件的进程。
- 声明应用必须具备哪些权限才能访问 API 中受保护的部分并与其他应用交互。还声明其他应用与该应用组件交互所需具备的权限
- 列出
Instrumentation
类,这些类可在应用运行时提供分析和其他信息。这些声明只会在应用处于开发阶段时出现在清单中,在应用发布之前将移除。 - 声明应用所需的最低 Android API 级别
- 列出应用必须链接到的库
详细清单文件文档介绍请参考链接: https://developer.android.google.cn/guide/topics/manifest/manifest-intro
Gradle
Android 构建系统编译应用资源和源代码,然后将它们打包成可供测试、部署、签署和分发的 APK。Android Studio 使用 Gradle 这一高级构建工具包来自动化执行和管理构建流程。
Android中的四大应用组件
Activity: 表示具有用户界面的单一屏幕。
Service: 是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。 服务不提供用户界面。例如,当用户位于其他应用中时,服务可能在后台播放音乐或者通过网络获取数据,但不会阻断用户与 Activity 的交互。 诸如 Activity 等其他组件可以启动服务,让其运行或与其绑定以便与其进行交互。
ContentProvider: 它管理一组共享的应用数据。我们可以将数据存储在文件系统、SQLite 数据库、网络上或我们的应用可以访问的任何其他永久性存储位置。 其他应用可以通过内容提供者查询数据,甚至修改数据(如果内容提供者允许)。 例如,Android 系统可提供管理用户联系人信息的内容提供程序。 因此,任何具有适当权限的应用都可以查询内容提供程序的某一部分,以读取和写入有关特定人员的信息。
BroadcastRecevier: 是一种用于响应系统范围广播通知的组件。 许多广播都是由系统发起的 — 例如,通知屏幕已关闭、电池电量不足或已拍摄照片的广播。应用也可以发起广播 — 例如,通知其他应用某些数据已下载至设备,并且可供其使用。 尽管广播接收器不会显示用户界面,但它们可以创建状态栏通知,在发生广播事件时提醒用户。 但广播接收器更常见的用途只是作为通向其他组件的“通道”,设计用于执行极少量的工作。 例如,它可能会基于事件发起一项服务来执行某项工作。
应用资源
在配置变更期间保留对象
有些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性及语言)。 发生这种变化时,Android 会重启正在运行的 Activity
(先后调用 onDestroy()
和 onCreate()
)。重启行为旨在通过利用与新设备配置匹配的备用资源自动重新加载您的应用,来帮助它适应新配置。要妥善处理重启行为,Activity 必须通过常规的Activity 生命周期恢复其以前的状态,在 Activity 生命周期中,Android 会在销毁 Activity 之前调用 onSaveInstanceState()
,以便您保存有关应用状态的数据。 然后,您可以在 onCreate()
或 onRestoreInstanceState()
期间恢复 Activity 状态。
如果重启 Activity 需要恢复大量数据、重新建立网络连接或执行其他密集操作,那么因配置变更而引起的完全重启可能会给用户留下应用运行缓慢的体验。 此外,依靠系统通过onSaveInstanceState()
回调为您保存的 Bundle
,可能无法完全恢复 Activity 状态,因为它并非设计用于携带大型对象(例如位图),而且其中的数据必须先序列化,再进行反序列化,这可能会消耗大量内存并使得配置变更速度缓慢。 在这种情况下,如果 Activity 因配置变更而重启,则可通过保留Fragment
来减轻重新初始化 Activity 的负担。此片段可能包含对您要保留的有状态对象的引用。
要在运行时配置变更期间将有状态的对象保留在片段中,请执行以下操作:
- 扩展
Fragment
类并声明对有状态对象的引用。 - 在创建片段后调用
setRetainInstance(boolean)
。 - 将片段添加到 Activity。
- 重启 Activity 后,使用
FragmentManager
检索片段。
例如,按如下方式定义片段:
1 public class RetainedFragment extends Fragment { 2 3 // data object we want to retain 4 private MyDataObject data; 5 6 // this method is only called once for this fragment 7 @Override 8 public void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 // retain this fragment 11 setRetainInstance(true); 12 } 13 14 public void setData(MyDataObject data) { 15 this.data = data; 16 } 17 18 public MyDataObject getData() { 19 return data; 20 } 21 }
然后,使用 FragmentManager
将片段添加到 Activity。在运行时配置变更期间再次启动 Activity 时,您可以获得片段中的数据对象。 例如,按如下方式定义 Activity:
1 public class MyActivity extends Activity { 2 3 private RetainedFragment dataFragment; 4 5 @Override 6 public void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.main); 9 10 // find the retained fragment on activity restarts 11 FragmentManager fm = getFragmentManager(); 12 dataFragment = (DataFragment) fm.findFragmentByTag(“data”); 13 14 // create the fragment and data the first time 15 if (dataFragment == null) { 16 // add the fragment 17 dataFragment = new DataFragment(); 18 fm.beginTransaction().add(dataFragment, “data”).commit(); 19 // load the data from the web 20 dataFragment.setData(loadMyData()); 21 } 22 23 // the data is available in dataFragment.getData() 24 ... 25 } 26 27 @Override 28 public void onDestroy() { 29 super.onDestroy(); 30 // store the data in the fragment 31 dataFragment.setData(collectMyLoadedData()); 32 } 33 }
在此示例中,onCreate()
添加了一个片段或恢复了对它的引用。此外,onCreate()
还将有状态的对象存储在片段实例内部。onDestroy()
对所保留的片段实例内的有状态对象进行更新。
文档链接: https://developer.android.google.cn/guide/topics/resources/runtime-changes