博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android service broadcastreceiver intentfilter
阅读量:5152 次
发布时间:2019-06-13

本文共 6716 字,大约阅读时间需要 22 分钟。

service 组件,和UI并不进行交互,运行在后台,可以和其他组件进行交互

broadcastreceiver,广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件

intentfilter Intent类似于Windows中的消息,而intentfilter可以理解为消息过滤器

下面我们用例子来说明如何运用这三种组件

首先,我们建立一个Serivce,他的作用是每间隔一秒生成一个随机数,并将随机数放到Intent中

然后声明一个action,在Service中进行广播,在MainActivity中来接收这个广播,并显示随机数.

为了可以使服务停止,我们另外建立了一个BroadCastReceiver 来接受广播,当判断广播内容是停止服务时,调用停止服务.

在服务的onCreate中,注册广播接收器组件,在onDestory中取消注册广播接收组件

在onStartCommand中声明了一个IntentFilter用来过滤广播消息,设定Action

先来看下Service和停止服务用的BroadCastReceiver 

package com.ssln.broadcastreceiver_service_intentfilter;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.IBinder;import android.util.Log;public class MyService extends Service {    public final static int CMD_STOP_SERVICE=1;    //停止服务    private CommandReciver cmdReceiver;    private boolean flag;    public final static String action="com.ssln.broadcastreceiver_service_intentfilter.MyService";    private static final String TAG = "MyService";    @Override    public IBinder onBind(Intent intent) {        return null;    }    @Override    public void onCreate() {        flag = true;        cmdReceiver = new CommandReciver();        super.onCreate();        Log.i(TAG, "MyService-->onCreate");    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.i(TAG, "MyService-->onStartCommand");        IntentFilter filter = new IntentFilter(); // 建立IntentFilter对象        filter.addAction(action);        // 注册广播接收,并设置接受的action        registerReceiver(cmdReceiver, filter);        Log.i(TAG, "MyService-->注册BroadcastReceiver成功");        // 启动线程        doJob();        return super.onStartCommand(intent, flags, startId);    }    @Override    public void onDestroy() {        Log.i(TAG, "MyService-->onDestroy");        // 取消广播接受的注册        unregisterReceiver(cmdReceiver);        Log.i(TAG, "MyService-->取消注册BroadcastReceiver成功");        super.onDestroy();    }    /**     * 执行线程     */    private void doJob() {        new Thread() {            public void run() {                while (flag) {                    try {                        Thread.sleep(1000);// 睡眠一秒                    } catch (Exception exp) {                        exp.printStackTrace();                    }                    Intent intent=new Intent();                    //设置action                    intent.setAction(action);                    //设置随机数                    intent.putExtra("data", Math.random());                    //发送广播                    sendBroadcast(intent);                    Log.i(TAG, "MyService-->doJob");                }            }        }.start();    }    /**     * 为了Service的停止,为Service注册Broadcast Receiver组件     * @author ssln     *     */    private class CommandReciver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            int cmd=intent.getExtras().getInt("cmd",-1);            if(cmd==CMD_STOP_SERVICE){                //停止线程                flag=false;                //停止服务                stopSelf();            }        }    }}

在来看看MainActivity.java

在onclick中,我们看到btnStart是启动了我们自定义的服务,而btnStop是发送了一个停止服务的广播内容

package com.ssln.broadcastreceiver_service_intentfilter;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener{    private static final String TAG = "MainActivity";    private TextView tvData;    private Button btnStart,btnStop;    private DataReceiver datareceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tvData=(TextView)findViewById(R.id.tvData);        btnStart=(Button)findViewById(R.id.btnStart);        btnStop=(Button)findViewById(R.id.btnStop);                btnStart.setOnClickListener(this);        btnStop.setOnClickListener(this);    }     /**     * 注册广播接收     */    private void RegDataReceiver()    {        if(datareceiver==null)        {            //注册action            datareceiver=new DataReceiver();            IntentFilter filter=new IntentFilter();            //添加接受的action            filter.addAction(MyService.action);            //注册            registerReceiver(datareceiver, filter);            Log.i(TAG, "注册广播成功");        }    }    /**     * 取消注册     */    private void UnRegDataReceiver()    {        if(datareceiver!=null)        {            unregisterReceiver(datareceiver);            datareceiver=null;            Log.i(TAG, "取消注册广播");        }    }    @Override    protected void onResume() {        RegDataReceiver();        Log.i(TAG, "onResume");        super.onResume();    }    @Override    protected void onPause() {        UnRegDataReceiver();        Log.i(TAG, "onPause");        super.onPause();    }    /**     * 接受线程发送过来的数据     * @author ssln     *     */    private class DataReceiver extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {            double data=intent.getDoubleExtra("data", 0.0d);            if(data==0)            {                int cmd=intent.getIntExtra("cmd", -1);                if(cmd==MyService.CMD_STOP_SERVICE)                    tvData.setText("停止服务成功");                else                    tvData.setText("未知数据");            }            else            {                tvData.setText("Service 发送的数据为: "+String.valueOf(data));            }        }            }    @Override    public void onClick(View v) {        if(v==btnStart)        {            Intent myIntent=new Intent(MainActivity.this,MyService.class);            startService(myIntent);            tvData.setText("启动服务成功 ");        }        else if(v==btnStop)        {            Intent myIntent=new Intent();            myIntent.setAction(MyService.action);            myIntent.putExtra("cmd", MyService.CMD_STOP_SERVICE);            sendBroadcast(myIntent);        }    }}

 

activity_main.xml

最后,记得在AndroidManifest.xml中注册我们的服务,否则启动不了的啊

看下效果,每秒生成的随机数都不同

我们点击停止后,会停止服务

转载于:https://www.cnblogs.com/alwaysfirst/p/4009108.html

你可能感兴趣的文章
kubernetes_book
查看>>
OpenFire 的安装和配置
查看>>
侧边栏广告和回到顶部
查看>>
https://blog.csdn.net/u012106306/article/details/80760744
查看>>
海上孤独的帆
查看>>
处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“Manag
查看>>
01: socket模块
查看>>
mysql触发器
查看>>
淌淌淌
查看>>
web页面实现指定区域打印功能
查看>>
win10每次开机都显示“你的硬件设置已更改,请重启电脑……”的解决办法
查看>>
C++有关 const & 内敛 & 友元&静态成员那些事
查看>>
函数积累
查看>>
Swift 入门之简单语法(六)
查看>>
〖Python〗-- IO多路复用
查看>>
栈(括号匹配)
查看>>
Java学习 · 初识 面向对象深入一
查看>>
源代码如何管理
查看>>
vue怎么将一个组件引入另一个组件?
查看>>
bzoj1040: [ZJOI2008]骑士
查看>>