Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
之前没太注意它的具体内容,最近遇到service后台运行的问题正好关注一下。
Android的应用程序都是基于组件来标识的。它由两部分组成:包名和类名
通过这两个参数,系统可以打开对应应用程序下的Activity或Service.
包名和类型的定义都在AndroidManifest.xml中,例如
packages/providers/MediaProvider/AndroidManifest.xml:
包名:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
//这就是包名
package="com.android.providers.media"
类名:
//类名是"MediaScannerService" ,是一个Service
<service android:name="MediaScannerService" android:exported="true">
<intent-filter>
<action android:name="android.media.IMediaScannerService" />
</intent-filter>
</service>
调用:
系统提供了ComponentName类来处理调用启动对应的类。
例子:
frameworks/base/media/java/android/media/MediaScannerConnection.java
public void connect() {
synchronized (this) {
if (!mConnected) {
Intent intent = new Intent(IMediaScannerService.class.getName());
intent.setComponent(
new ComponentName("com.android.providers.media",
"com.android.providers.media.MediaScannerService"));
mContext.bindService(intent, this, Context.BIND_AUTO_CREATE);
mConnected = true;
}
}
}
注意:
1. 类名可以包含包名,也可以省略包名,以.开头
2. 启动的Activity或者Service如果不是入口Activity或者Service,那么一定要加上Android:exported=”true”