四大组件之Activity、BroadCast Recevier

四大组件:Activity、BroadCast Revicer、Context Provider、Service

Activity:直接与用户进行交互的界面。

  1. 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>
    
  2. 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
  1. 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");
    
  2. Activity活动启动模式
    启动模式 standard、 singleTop、singleTask 和 singleInstance。在 AndroidManifest中activity标签指定,android:launchMode 属性来选择启动模式。

    • standard:系统默认启动模式。每次启动即创建一个实例.
    • singleTop:每次启动即创建一个实例,但当前实例在栈顶,则不会创建实例,可直接使用。
    • singleTask:启动判断栈中是否创建实例,若没有,创建实例;若有,将这个活动之上的所有活动统统出栈。
    • singleInstance:启用一个新的返回栈来管理这个活动,随时用,随时取。

BroadCast Revicer:广播接收者。注册系统广播,需要相应的权限

  1. 应用场景:系统基本广播:电量通知,网络变化,时区改变等等。
  2. 注册方式:
    动态注册:代码中注册

    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);
    
  3. 广播接收器:新建一个类,继承自 BroadcastReceiver,重写父类的 onReceive()方法,逻辑在 onReceive()中处理。

     class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
        }
    }
    
  4. 自定义广播:

        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);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值