四大组件之广播BroadcastReceiver

一.Activity

   生命周期

       onCreate():活动第一次创建时

       onStart():活动从不可见变为可见时

       onResume():活动准备好和用户交互时

       onPause():暂停(准备去启动另一个页面时调用)

       onStop():活动不可见

       onDestroy():活动被销毁

       onRestart():活动由停止变为运行

   生命周期实例

A页面跳转至B页面
          1.B页面完全覆盖A页面时
           A-onPause->B-onCreate->B-onStart->B-onResume->A-Stop   
          2.B页面不完全覆盖A页面时
           A-onPause->B-onCreate->B-onstart->B-onResume
B页面返回A页面
     1.B页面完全覆盖A页面时
          B-onPause-->A-onRestart-->A--onStart-->A-onResume-->B-onStop->B-onDestroy
         2.B页面不完全覆盖A页面时
          B-onPause-->A-onResume--B-onStop--B-onDestroy

启动模式

singleInstance:申明为此模式时,当前Activity会单独使用一个栈管理,目的是可以使其他程序和此程序共享這个活动的实例
singleTask:启动新的活动时,检查栈中是否有该活动的实例,发现就直接使用,并把這个活动实例之上的所有实例全部出栈,没发现才创建一个新势力
singleTop:只检查栈顶是否有该活动实例
singleInstance(默认):启动新的活动时,直接创建新的实例加入栈顶,返回时会重复关掉所有创建的实例
4种状态
1.运行状态:在栈顶
     一个活动位于返回栈的栈顶 

2.暂停状态:不在栈顶,且可见
    当一个活动不再处于栈顶,但任然可见(不会占满整个屏幕的页面,如:对话窗口)
只有在系统内存极地的情况下,系统才会回收这种活动

3.停止状态:不在栈顶,且不可见
     当一个活动不再处于栈顶,且完全不可见,系统任然会为这种活动保存相应的状态和成员变量,但这是完全不可靠的,当其他地方需要内存时,处于停止状态的活动会被系统回收

4.销毁状态:不在栈中
     当一个活动从返回栈中移除后,系统会回收这种活动,以保存手机内存充足




另外:

1.onActivityResult()用于获取新页面返回的数据,代码片段如下(其中resultCode代表新页面中传入的代号值

  @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (resultCode) {
            case -1:
                title.clear();
                subject.clear();
                title = ((ArrayList) data.getSerializableExtra("title"));
                    switch (title.get(i)) {
                        case "自选":
                            subject.add(new MyOptionMarket());
                            break;
                        case "上海黄金交易所":
                            subject.add(new CGMarket());
                            break; 
                }
                break;
            case 2:   //在more中点击选项进入对应页面
                int position = data.getIntExtra("position", 0);
                break;
        }
    }


2.在AndroidMainfest.xmlactivity标签中添加android:configChanges="orientation|keyboardHidden|screenSize"时,
切屏就不会重新调用当前Activity的生命周期,只会执行onConfigurationChanged回调方法




二.BroadcastReceiver

可以把BroadcastReceiver比喻成一个全局的超级大喇叭,用于接受来自系统或程序发送的广播,发送时,是利用Intent传递,且分为普通广播(异步操作,接收没有先后顺序)和有序广播(接受有先后顺序,前一个接受者可以中断或添加广播消息)

BroadcastReceiver的生命周期只有10秒左右,所以不建议在onReceive()内执行耗时操作

发送广播:

    发送普通广播:

    Intent it = new Intent();
                it.setAction("text");           //广播地址
                it1.putExtra("msg", "简单消息");
                sendBroadcast(it);             // 普通发送

    发送有序广播:

    Intent it = new Intent();
                it.setAction("text");            <span style="font-family: Arial, Helvetica, sans-serif;"> //广播地址</span>
                it.putExtra("msg", "简单消息");
                sendOrdereBroadcast(it,null);           //有序发送

接收广播:

    动态注册:

    IntentFilter filter=new IntentFilter("text");    //指定要收听的广播地址
            registerReceiver(<span style="font-size: 18px;">BroadcastReceiver,filter</span>);  //参数1为<span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">BroadcastReceiver的实现类</span>
           

    静态注册: 

<span style="font-size:18px;"> <receiver android:name=".Text">     //Text是类名 
            <intent-filter>
                <action android:name="<span style="font-family:Arial, Helvetica, sans-serif;">text</span>"></action>  
            </intent-filter>
        </receiver></span>


 实例:发送并接收一个有序广播(通过静态注册方式接收)

       发送普通广播:

       it = new Intent();
                it.setAction("11");
                it.putExtra("msg", "简单消息");
                sendOrderedBroadcast(it,null);
      第一个接收类:

public class Text extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "text收到:" + intent.getStringExtra("msg"), Toast.LENGTH_LONG).show();
      /**
       * 通过bundle存入添加广播消息
       * */
        Bundle bundle=new Bundle();
        bundle.putString("text","text存入的消息");
        setResultExtras(bundle);
       // abortBroadcast(); 加上此句代码,则下一个不会收到广播

    }
}

      第二个接收类:

public class Text1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle=getResultExtras(true);
        String s=bundle.getString("text");  //接收上一个广播接收者存入的消息
 Toast.makeText(context,"text1收到:" +intent.getStringExtra("msg")+s,Toast.LENGTH_LONG).show();


    }
}

     两个类的静态注册:

  <receiver android:name=".Text">
            <intent-filter>
                <action android:name="11"></action> <!--表示收听11这个广播-->
            </intent-filter>
        </receiver>
        <receiver android:name=".Text1">
            <intent-filter>
                <action android:name="11"></action>
            </intent-filter>
        </receiver>



需要注意的是部分系统广播只能通过代码注册,使用静态方式时会没有效果,比如屏幕解锁的广播..



另外还有一种广播LocalBroadcastManager,主要用于程序内部使用,安全,效率,不会被其他程序窃听,用法差别不大

发送广播:

<span style="font-size:18px;">    Intent intent = new Intent("22");
                intent.putExtra("msg", "haha");
                LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(MainActivity.this);
                lbm.sendBroadcast(intent);</span>

接收广播:

<span style="font-size:24px;">   </span><span style="font-size:18px;">   IntentFilter filter = new IntentFilter("22");
        LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(MainActivity.this);
        lbm.registerReceiver(new my(),filter);</span>

收到广播时Toast一下
<span style="font-size:18px;"> class my extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String message = intent.getStringExtra("msg");
            Toast.makeText(context, "text收到:" + intent.getStringExtra("msg"), Toast.LENGTH_LONG).show();
        }
    }</span><span style="font-size:24px;">
</span>

三.Service

   service没有界面的Activity,用于执行后台任务,属于UI线程,故不能再他里面执行耗时操作(创建线程操作)

启动方式一:

Intent it=new Intent(context,MyService.class);
  startService(it);//启动服务
  stopService(it); //停止服务
方式一的生命周期:

     onCreate:创建时执行一次
     onStartCommand:每次开启都执行
     onDestroy:销毁时执行一次  
启动方式二:


四.Activity




      









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值