总结:整体需要关注的几个地方。
包名,文件名,类名。
activcity,布局文件。
AndroidManifest,权限,主题
资源文件
Android Support Library介绍 - 知乎 (zhihu.com)
Android程序库:
- android.app - 提供应用程序模型的访问,是所有 Android 应用程序的基石。
- android.content - 方便应用程序之间,应用程序组件之间的内容访问,发布,消息传递。
- android.database - 用于访问内容提供者发布的数据,包含 SQLite 数据库管理类。
- android.opengl - OpenGL ES 3D 图片渲染 API 的 Java 接口。
- android.os - 提供应用程序访问标注操作系统服务的能力,包括消息,系统服务和进程间通信。
- android.text - 在设备显示上渲染和操作文本。
- android.view - 应用程序用户界面的基础构建块。
- android.widget - 丰富的预置用户界面组件集合,包括按钮,标签,列表,布局管理,单选按钮等。
- android.webkit - 一系列类的集合,允许为应用程序提供内建的 Web 浏览能力。
看过了 Android 运行层内的基于 Java 的核心程序库,是时候关注一下 Android 软件栈中的基于 C/C++ 的程序库。
应用框架
应用框架层以 Java 类的形式为应用程序提供许多高级的服务。应用程序开发者被允许在应用中使用这些服务。
- 活动管理者 - 控制应用程序生命周期和活动栈的所有方面。
- 内容提供者 - 允许应用程序之间发布和分享数据。
- 资源管理器 - 提供对非代码嵌入资源的访问,如字符串,颜色设置和用户界面布局。
- 通知管理器 - 允许应用程序显示对话框或者通知给用户。
- 视图系统 - 一个可扩展的视图集合,用于创建应用程序用户界面。
----------------------------------------
组件 | 描述 |
---|---|
Activities | 描述UI,并且处理用户与机器屏幕的交互。 |
Services | 处理与应用程序关联的后台操作。 |
Broadcast Receivers | 处理Android操作系统和应用程序之间的通信。 |
Content Providers | 处理数据和数据库管理方面的问题。 |
广播接收器简单地响应从其他应用程序或者系统发来的广播消息。举个例子,应用程序可以发起广播来让其他应用程序知道一些数据已经被下载到设备,并且可以供他们使用。因此广播接收器会拦截这些通信并采取适当的行动。
内容提供者组件通过请求从一个应用程序到另一个应用程序提供数据。这些请求由ContentResolver类的方法来处理。
-----------------------------------------------------------------------------
基本知识:
- Layout 是用来组织和管理 View 的容器,它决定了 View 在界面中的位置和排列方式。
- View 是 Layout 中的子元素,它们被放置在 Layout 中的不同位置,并根据 Layout 的规则进行布局和显示。
Resources | 外部元素,例如字符串资源、常量资源及图片资源等。 |
Manifest | 应用程序的配置文件。这个文件是Android操作系统与你的应用程序之间的接口 |
-
android.intent.category.LAUNCHER
是一个 Intent 类别,用于指定一个活动作为应用程序的启动器,即当用户点击应用程序图标时启动的活动。使其成为应用程序的入口点。(不论是 MAIN 动作还是 LAUNCHER 类别没有在活动中声明,那么应用程序的图标将不会出现在主屏幕的应用列表中。) -
每个为应用程序所定义的活动都需要在AndroidManifest.xml中声明。应用的主要活动需要在清单中声明,且意图过滤器标签中需要包含 MAIN 动作和 LAUNCHER 类别
---------------------------------------------------
Android 服务(Service)服务是一个后台运行的组件,即使应用被销毁也依然可以工作。
Android 服务(Service) | 菜鸟教程 (runoob.com)
广播接收者:Android 广播接收器(Broadcast Receivers) | 菜鸟教程 (runoob.com)
静态注册:AndroidManifest文件中添加标签(意图过滤器为系统定义,或自定义),自定义广播接收者,接收系统或应用发出的广播。
或者:AndroidManifest文件中添加标签(意图过滤器为自己定义或系统定义),一个程序/activity发送自定义广播,自定义广播接收者处理。其实和上一段一样。
这种方式的广播接收者在应用程序安装时被注册,无需在运行时启动应用程序即可接收广播。
动态注册:
需要创建广播接收者,还需要增加过滤器,注册广播的代码,示例:
receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
registerReceiver(receiver, filter);
-----------
内容提供者:
Android 内容提供者(Content Provider) | 菜鸟教程
StudentsProvider
.一旦被加载,SQLiteOpenHelper的子类就创建数据库,创建表。创建数据。调用 getWritableDatabase() 方法获取一个可写的数据库对象。如果数据库不存在,则会调用 DatabaseHelper 的 onCreate() 方法来创建数据库,如果数据库需要升级,则会调用 onUpgrade() 方法进行升级操作。
.增删改查的方法提供使用。
Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);将插入数据的行号追加到内容 URI 后面,形成完整的数据位置 Uri。
感觉挺复杂的。
Intent意图:
显式:
startActivity()
方法将创建的 Intent 对象传递给系统,系统会根据 Intent 的描述来启动相应的 Activity。显式意图用于连接应用程序的内部世界。
// 创建一个新的 Intent 对象,指定要启动的目标 Activity
Intent intent = new Intent(this, TargetActivity.class);
// 如果需要传递数据给目标 Activity,可以使用 putExtra() 方法
intent.putExtra("key", "value");
// 启动目标 Activity
startActivity(intent);
可以是自定义的目标activity,也可以是系统预定义的。
------
隐式:
- Intent 可以指定要执行的操作,这可以是系统预定义的操作,也可以是自定义的操作。例如,指定 ACTION_VIEW 来打开一个网页,或者指定自定义的操作来执行特定的逻辑。
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
隐式意图经常用于激活其他应用程序的组件
Intent read1=new Intent();
read1.setAction(android.content.Intent.ACTION_VIEW);
read1.setData(ContactsContract.Contacts.CONTENT_URI);
startActivity(read1);
笔记:
清单文件中指定某Activity的行为action,那么,当启动用隐式intent时,系统会根据 Intent 中的动作、类别或数据等信息来确定。如:
详细深入的一些使用方面:Data
序号 | 动作/数据组和描述 |
---|---|
1 | ACTION_VIEW content://contacts/people/1:显示ID为1的用户的信息。 |
Android 服务(Service) | 菜鸟教程 (runoob.com)
内容提供者:例子中的代码说明
1.首先,你需要继承类 ContentProviderbase 来创建一个内容提供者类。
2.其次,你需要定义用于访问内容的你的内容提供者URI地址。
3.接下来,你需要创建数据库来保存内容。通常,Android 使用 SQLite 数据库,并在框架中重写 onCreate() 方法来使用 SQLiteOpenHelper 的方法创建或者打开提供者的数据库。当你的应用程序被启动,它的每个内容提供者的 onCreate() 方法将在应用程序主线程中被调用。
uri,创建数据库,表,字段
static final int STUDENTS = 1;
static final int STUDENT_ID = 2;
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "students", STUDENTS);
uriMatcher.addURI(PROVIDER_NAME, "students/#", STUDENT_ID);
}
addURI 方法用于向 UriMatcher 添加URI匹配规则。
如果匹配到content://{PROVIDER_NAME}/students,就会返回STUDENTS,如果匹配到content://{PROVIDER_NAME}/students/#,那么就会返回STUDENT_ID,
switch (uriMatcher.match(uri)) {
case STUDENTS:
qb.setProjectionMap(STUDENTS_PROJECTION_MAP);
break;
case STUDENT_ID:
qb.appendWhere( _ID + "=" + uri.getPathSegments().get(1));
//uri.getPathSegments().get(1)获取到的是uri中要查询的参数
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
Cursor c = qb.query(db, projection, selection, selectionArgs,null, null, sortOrder);
db: SQLiteDatabase 对象,表示要查询的数据库。
projection: 一个字符串数组,表示要查询的列。如果为 null,则查询所有列。
selection: 一个字符串,表示查询条件(WHERE 子句),不包括 WHERE 关键字。如果为 null,则没有查询条件。
selectionArgs: 一个字符串数组,表示查询条件中的参数值。用于替换 selection 中的 ? 占位符。