Android-Study-Plan-XV -- 四大组件
Android学习计划
Android中的四大组件每个组件的作用是什么?他们都可以开启多进程吗?
Android四大组件:
Activity
Activity的主要作用是展示一个界面并和用户直接交互。
activity的启动由Intent触发(需要在AndroidManifest.xml中注册)。Intent分为两种:
显示Intent:直接跳转至指定的Activity类
1
2
3
4
5
6
7
8
9
10
11
12
13
14// 构造方法中直接传入Component
Intent intent=new Intent(this,Activity.class);
startActivity(intent);
// 调用SetComponent方法
ComponentName componentName=new Component(this,Activity.class);
Intent intent=new Intent();
intent.setComponentName(componentName);
startActivity(intent);
// 使用setClass方法
Intent intent=new Intent();
intent.setClassName(this,Activity.class);
startActivity(intent);隐式Intent:不明确指定启动哪个Activity,而是利用Activity配置的Action,Data,Category来让系统进行选择(
筛选是根据所有的<intent-filter>来筛选
)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<activity android:name=".MainActivity">
<intent-filter>
<action android:name="TestActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
// setAction方法
Intent intent=new Intent();
intent.setAction("TestActivity");
startActivity(intent);
//直接构造Action
Intent intent=new Intent("TestActivity");
startActivity(intent);
//在使用隐式调用时需要注意该Action是否存在,所以需要做try-catch防止异常发生
//利用这个方法可以判断是否有处理该Action的Activity存在
intent.resolveActivity(getPackageManager())
Service
Service主要用于在后台执行一系列需要耗时的任务,需要单独的线程去完成,因为Service本身是运行在主线程的。Service不会与UI进行交互,其他的组件也可以启动Service,即便用户切换了应用,Service依然后台运行。(需要在AndroidManifest.xml中注册),Service有两种启动方式:
startService
:启动一个Service,系统回调onStartCommand()方法
,需要调用stopService()
来停止ServicebindService
:绑定一个Service,调用unBindService()
来取消绑定,或者关闭绑定的组件也可以停止
BroadcastReceiver
广播主要用于在不同的组件甚至不用的应用间进行消息传递,不与用户产生交互,工作在系统内部。
广播的注册方式有两种:
静态注册 (需要在AndroidManifest.xml中注册)
1
2
3
4
5
6
7
8
9
10
11
12
13<receiver android:name=".MyReceiver"
android:enabled=["true" | "false"]
<!--此broadcastReceiver能否接收其他App的发出的广播-->
//默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
android:exported=["true" | "false"]
android:label="string resource"
<!--具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收-->
android:permission="string"
>
<intent-filter>
<action android:name="com.test"/>
</intent-filter>
</receiver>动态注册
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18//最好在onResume中注册广播
@Override
protected void onResume(){
super.onResume();
mBroadcastReceiver=new BroadcastReceiver();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.test");
this.registerReceiver(mBroadcastReceiver,intentFilter);
}
//在onPause中取消注册
@Override
protected void onPause(){
super.onPause();
this.unregisterReceiver(mBroadcastReceiver);
}
ContentProvider
主要用于给不同的应用提供共享数据,(需要在AndroidManifest.xml中注册)
1
2
3
4
5
6
7<provider
android:name="wxy.provider.MyContentProvider"
android:authorities="wxy.provider"
android:exported="true"
<!--是否可被其他应用使用 -->
>
</provider>ContentProvider默认执行在主线程,需要实现以下方法
onCreate()
:初始化Providerquery()
:查询数据 需异步操作insert()
:插入数据update()
:更新Provider的数据delete()
:删除Provider的数据getType()
:返回指定Uri中的数据MIME类型
相关的操作可能会被多个线程并发调用需要注意线程安全。
开启多进程
Android的四大组件都可以开启多进程,只要在AndroidManifest.xml中配置android:process="any"
,需要配置android:exported
属性
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!