四大组件:Activity、BroadCast Revicer、Context Provider、Service
Activity:直接与用户进行交互的界面。
Activity注册
在AndroidManifest中进行注册,所有的注册都要放在标签中,其中主活动标签为intent-filter;<activity android:name=".ui.activities.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
- Activity生命周期
代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate: " );
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart: " );
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "onResume: " );
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "onPause: " );
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "onRestart: " );
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy: " );
}
打开一个程序窗口,按下back键,log打印为:
MainActivity: onCreate:
MainActivity: onStart:
MainActivity: onResume:
MainActivity: onPause:
MainActivity: onStop:
MainActivity: onDestroy:
打开一个程序窗口,跳转到另一个程序窗口,然后再返回在第一个窗口,按下back键,log打印为:
MainActivity: onCreate
MainActivity: onStart
MainActivity: onResume //第一个界面显示于用户
MainActivity: onPause
SecActivity: onCreate
SecActivity: onStart
SecActivity: onResume
MainActivity: onStop //从第一个界面跳转至第二个界面显示
SecActivity: onPause
MainActivity: onRestart
MainActivity: onStart
MainActivity: onResume
SecActivity: onStop
SecActivity: onDestroy //按下back键,第一个界面显示
MainActivity: onPause
MainActivity: onStop
MainActivity: onDestroy
Activity信息传递Intent
Intent显式:Intent intent = new Intent(MainActivity.this,SecActivity.class); startActivity(intent);
Intent隐式:
在AndroidManifest中: <activity android:name=".SecActivity"> <intent-filter> <action android:name="com.example.admin.activitytest.ACTION_START" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 在activity中: Intent intent = new Intent("com.example.admin.activitytest.ACTION_START"); startActivity(intent); <activity android:name=".SecActivity"> <intent-filter> <action android:name="com.example.admin.activitytest.ACTION_START" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="com.example.admin.activitytest.MY_CATEGORY" /> </intent-filter> </activity>
每个Intent中只能指定一个action,可以有多个category,但注意必须要在AndroidManifest中进行声明。category包含一些附加信息。
这里更多多个category存在的意义,待探究。隐式Intent除了可以启动内部Activity,还可启动其他外部程序。使得多个应用程序之间互通。
启动照相机: Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent .putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment. getExternalStorageDirectory(), "temp.jpg"))); startActivityForResult(intent , CAMERA_REQUEST_CODE);
扩展:标签 intent-filter中标签data,精确地指定当前活动能够响应什么类型的数据,通常携带的数据量小。
Intent数据传递:
String data = "Hello world"; Intent intent = new Intent(MainActivity.this, SecActivity.class); intent.putExtra("data", data); startActivity(intent); Intent intent = getIntent(); String data = intent.getStringExtra("data");
Activity活动启动模式
启动模式 standard、 singleTop、singleTask 和 singleInstance。在 AndroidManifest中activity标签指定,android:launchMode 属性来选择启动模式。- standard:系统默认启动模式。每次启动即创建一个实例.
- singleTop:每次启动即创建一个实例,但当前实例在栈顶,则不会创建实例,可直接使用。
- singleTask:启动判断栈中是否创建实例,若没有,创建实例;若有,将这个活动之上的所有活动统统出栈。
- singleInstance:启用一个新的返回栈来管理这个活动,随时用,随时取。
BroadCast Revicer:广播接收者。注册系统广播,需要相应的权限
- 应用场景:系统基本广播:电量通知,网络变化,时区改变等等。
注册方式:
动态注册:代码中注册IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter);
静态注册:AndroidManifest.xml 中注册
<receiver android:name=".NetworkChangeReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
广播销毁:
unregisterReceiver(networkChangeReceiver);
广播接收器:新建一个类,继承自 BroadcastReceiver,重写父类的 onReceive()方法,逻辑在 onReceive()中处理。
class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show(); } }
自定义广播:
AndroidManifest.xml广播注册: <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.admin.activitytest.MY_BROADCAST"/> </intent-filter> </receiver> 广播接收器: class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "My BroadCast", Toast.LENGTH_SHORT).show(); } } 发送广播: Intent intent = new Intent("com.example.admin.activitytest.MY_BROADCAST"); sendBroadcast(intent);
5.本地广播:
广播注册: LocalBroadcastManager mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); mFinishActivityBroadcastReceiver = new FinishActivityBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(INTENT_UPDATE_PAGES_ACTION); mLocalBroadcastManager.registerReceiver(mFinishActivityBroadcastReceiver, filter); 广播接收器: private class FinishActivityBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "My BroadCast", Toast.LENGTH_SHORT).show(); } } 发送广播: Intent intent = new Intent("com.example.admin.activitytest.MY_BROADCAST"); sendBroadcast(intent); 销毁广播: localBroadcastManager.unregisterReceiver(localReceiver);