四大组件概论
如果把四大组件比作MP4中的电影播放系统,那么要保证这个系统有基础功能则:
- Activity是显示到屏幕上的电影画面—-能看到,还能交互(必须,即使没有播放电影也需要基础界面,交互有快进、音量操作等)。
- Service是影音文件读取器—-看不到,但是没有他看不了电影(非必须,但对看电影这一操作来说是必须的)。
- BroadcastReceiver是通知服务—-看不到,如果电量不足立刻发送广播弹窗提醒你(非必须,除了电量监测还可有其他服务)。
- ContentProvider是获取系统时间服务—-看不到,通过访问系统时钟组件获取时间信息,时间非本程序功能(非必须,跨进程通信)。
Android四大组件,除了BroadcastReceiver,其他三种必学在AndroidManifest.xml 文件中注册,BroadcastReceiver既可以在AndroidManifest.xml文件中注册也可以在java代码中注册。在调用方式上Activity、Service、和BroadcastReceiver必须通过Intent调用,而ContentProvider不必。
Activity和View搭配显示布局:
Activity是我们最常见的一个组件,他与View搭配完成了界面的显示。我们初始创建helloworld应用的时候有setContentView(R.layout.activity_main)与一个activity_main.xml搭配来显示初始界面。其实我们还可以这样写:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
setContentView(layout);
}
就这样写就可以显示出一个空白界面的布局,不用要activity_main.xml 文件。其实我们分析一下,activity_main.xml里边也是一个LinearLayout布局,其实他们加载的是一样的。
Activity继承关系
java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity
//直接或间接继承Context、ContextWrapper、ContextThemeWrapper类,可直接调用其方法
Known Direct Subclasses
- AccountAuthenticatorActivity(账户管理界面的Activity),
- ActivityGroup,
- AliasActivity(启动其他Activity结束自己),
- FragmentActivity,
- ListActivity,
- NativeActivity(用c++写android的activity)
Known Indirect Subclasses
- ActionBarActivity,
- AppCompatActivity,
- LauncherActivity(继承ListActivity,类列表界面),
- PreferenceActivity(继承后Activity托管系统读写参数,一般用于系统设置界面),
- TabActivity
AS2.3新建项目我们发现默认继承AppcompatActivity,相比以往,Android5.0之后,supportV7更新包,使用了AppCompatActivity来代替ActionBarActivity,继承Activity会发现没有ActionBar的导航栏,继承ActionBarActivity会发现提示他已经过时了,所以AppCompatActivity是更新后Google推荐使用的,继承Activity和AppCompatActivity区别是Activity没有给你加载ActionBar支持,所以项目创建后AppCompatActivity的包要比Activity的大近10M左右。
Activity的显式配置
在AndroidManifest.xml文件中标签下声明我们的Activity,我们新建一个Activity,AS自动帮我们在下创建标签并声明好命名空间。
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:theme="@style/AppTheme"
android:launchMode="singleInstance"
android:exported="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>