• Android 学习笔记 BroadcastReceiver广播...


    PS:不断提升自己,是件好事...

    学习内容:

    1.BroadcastReceiver的使用..

    2.通过BroadcastReceiver去启动Service...

    1.BroadcastReceiver...

      广播接收者,用来接收系统和应用中的广播...Android广播机制用的地方还是很多的,比如说:当网络状态发生改变的时候,通过接收这条广播就能及时做出相应的响应,然后完成一些操作..这就是广播的机制...它自身并不实现图形用户界面...只是一个触发性的操作...

      使用广播是需要几个步骤的...

    i.那就是建立一个类来实现一个广播,再类中定义响应的方法...来完成一些响应的操作...

    ii.广播这个东西是需要注册的,不进行注册是无法使用的....

    注册的方式有两种:

                    一种是静态注册,静态注册就是配置AndroidManifest.xml文件进行配置,由系统管理receiver,属于常驻型的...

    <!--这段代码添加在application之间就可以了。。。-->
    <receiver android:name=".MyBroadcast"
                      android:enabled="true">
                <intent-filter>
                    <action android:name="android.intent.action.EDIT"/>
                </intent-filter>
    </receiver>

                              二种则是动态注册...属于非常驻型的,并且隐藏在代码块之间...不容易发现...

    private BroadcastReceiver receiver;
    
    receiver=new CallReceiver();
    //动态注册广播地址...
    registerReceiver(receiver,new IntentFilter("android.intent.action.EDIT"));
    //解除注册的广播地址,一定要对广播机制进行注销...
    unregisterReceiver(receiver);

    iii.注册完成后就是进行发送广播了...这样广播接收者就可以正常工作了...先构建一个Intent对象,然后调用sendBroadcast(Intent)方法将广播发出...

        还有一点就是,对象调用了onReceive()方法时广播才是有效的,当从这个函数返回之后,这个对象就无效了..因此广播的生命周期是非常短暂的,也就仅仅十几秒的生命周期,因此不要在其中加入一些耗时的操作,耗时的操作可以交给Service去完成,广播就是完成一些非常小的操作就可以了...粘一个代码...

    package com.example.broadcast_receiver;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    
    public class MyBroadcast extends BroadcastReceiver{
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            String str=intent.getStringExtra("msg");
            Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
        }
    }

    上面就是定义一个广播接收类,它继承于BroadcastReceiver,在其中完成一些相应的操作....

    package com.example.broadcast_receiver;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.content.Intent;
    public class MainActivity extends Activity implements View.OnClickListener {
    
        private Intent intent=new Intent(Intent.ACTION_EDIT);
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            findViewById(R.id.broadcast).setOnClickListener(this);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (v.getId()) {
            case R.id.broadcast:
                intent.putExtra("msg", "aa");
                MainActivity.this.sendBroadcast(intent);
                break;
            }
        }
    
    }

      这个就是如何在MainActivity中调用广播接收者,很简单的一个动作,就是触发按钮,然后会在屏幕上输出"aa"这条信息...很简单的一个操作,布局文件就一个按钮,没必要去粘贴...重要的是理解一下这个过程,不要忘了使用BroadcastReceiver时一定要进行注册,否则是不能进行使用的....

    2.如何使用BroadcastReceiver去启动Service...

      前面已经说过,BroadcastReceiver对象的生命周期是非常短暂的...那么耗时的动作是无法在这里执行的,但是我们可以在BroadcastReceiver中去调用Service...让Service去执行耗时的服务...简单的介绍一下如何去启动Service...

    i.首先我们先定义一个Service...

    package com.example.broadcast_receiver;
    
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.os.IBinder;
    
    public class MyService extends Service{
    
        private MediaPlayer media;
        @Override
        public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
        }
        @Override
        public void onCreate(){
            super.onCreate();
            media=MediaPlayer.create(MyService.this, R.raw.a);
            MyService.this.media.prepare();
            MyService.this.media.start();
            media.setLooping(true);
        }
        @Override
        public void onDestroy(){
            super.onDestroy();
        }
        @Override
        public void onStart(Intent intent,int startId){
            super.onStart(intent, startId);
        }
    }

    这里我们需要复制一首歌曲到res aw文件夹下一首歌曲...raw文件夹我们自己进行新建...

    package com.example.broadcast_receiver;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    
    public class MyBroadcast extends BroadcastReceiver{
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Intent newintent =new Intent(context,MyService.class);
            context.startService(newintent);
            String str=intent.getStringExtra("msg");
            Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
        }  
    }

         这个是广播类,从广播的内部去启动Service.....然后在AndroidManifest.xml文件中的<application>和</application>之间加入代码<service android:name=".MyService" android:enable="true"/>就搞定了...

      这样就完成了在BroadcastReceiver()内部去启动Service.....

                     

  • 相关阅读:
    js全局变量和局部变量
    mysql分组后保留n条数据
    记一次微信公众号的开发与后台搭建
    Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决
    一言之思-3
    时间获取
    sql基础的基础
    一言之思-2
    一言之思
    node.js日期
  • 原文地址:https://www.cnblogs.com/RGogoing/p/4557370.html
Copyright © 2020-2023  润新知