利用Intent使Activity和Service通过BroadcastReceiver进行数据交互
2016-05-10 19:42
423 查看
对于Android中有四个组件Acitivity,Service,Broadcast,ContentProvider,对于ContentProvider是跨应用的一种数据交换的标准。今天就不先讲这个。
我们先考虑一下如何在一个demo中实现Acitivity,Service,BroadcastReceiver之间的数据联系。
我们可以利用Intent作为一个"信使"来传递一些信息。
1)new 一个Activity,在Acitivity中进行事件的处理,可以利用一个点击事件等,来构建一个显示意图 fg:Intent intent=new Intent(this,xxx.class) note01:xxx为目标Service note02:在明确使用这个显示意图的时候,这个Service必须是事先构建完成
note:也可以利用一个控件的事件处理对指定的Service进行停止(停止数据交互)
================================================================================================================
2)既然用Intent来发送了一个显示意图,明确指定了一个Service启动(开启数据交互),对于Acitivy中不间断从service中获得数据的话,可以利用在Service中的onCreate()中用一个handler(全局变量)来发送一个延迟消息
handler.postDelayed(new Runnable(){#####note:在有一个类继承Runnable(接口)Thread构建的时候,run()中的代码就会执行,
note:以下代码是API中对postDelayed进行描述:------》将一个runnable添加到消息队列中,当这个runnable当这个线程和handler关联的时候
Causes the Runnable r to be added to the message queue.
* The runnable will be run on the thread to which this handler is
* attached.
重写run(){
1)构建一个Intent对象,(大部分是用来启动一个BroadcastRecriver)
2)对于的事件处理
3)启动对于的组件事件(sendBroadcast or startAcitivity 获得是在启动一个服务),note:这里用到最多的就是发送一个BroadcastReceiver
4)如果想要不间断的进行数据交互的话,可以在匿名内部类里继续发延迟消息 handler.postDelayed(this, 1000);
}
})
note:对于service需要对其进行销毁,可以在onDestroy()进行处理
@Override
public void onDestroy() {
Log.d("TAG","服务被销毁");
handler.removeCallbacksAndMessages(null);
super.onDestroy();
}
这个方式:只是针对于利用Handler来发送消息
========================================================================================================================
由于在Service中每次都会启动一个Broadcast,将在Service中进行处理的数据发到Activity中,这就可以在Activity中利用一个BroadcastReceiver的实现类来接受数据 note:BroadcastReceiver是一个abstract的
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if("%%%%%".equals(action)){ note:%%%%%是在Service中利用Intent来进行封装的。
//从intent中,把数据取出来,放到指定的位置进行数据处理
//进行数据的处理
}
}
}
note:BroadcastReceiver是需要注册和注销
注册:@Override
protected void onResume() {
super.onResume();
receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();//构建广播的过滤器,由于在Android中有很多广播,这就需要对指定的intent中的封装的信息就行处理
filter.addAction("%%%%%");//对过滤器就行添加过滤广播类型
registerReceiver(receiver, filter);//注册广播
}
注销:@Override
protected void onPause() {
unregisterReceiver(receiver);//注销广播
super.onPause();
}
======================================================================
我们先考虑一下如何在一个demo中实现Acitivity,Service,BroadcastReceiver之间的数据联系。
我们可以利用Intent作为一个"信使"来传递一些信息。
1)new 一个Activity,在Acitivity中进行事件的处理,可以利用一个点击事件等,来构建一个显示意图 fg:Intent intent=new Intent(this,xxx.class) note01:xxx为目标Service note02:在明确使用这个显示意图的时候,这个Service必须是事先构建完成
note:也可以利用一个控件的事件处理对指定的Service进行停止(停止数据交互)
================================================================================================================
2)既然用Intent来发送了一个显示意图,明确指定了一个Service启动(开启数据交互),对于Acitivy中不间断从service中获得数据的话,可以利用在Service中的onCreate()中用一个handler(全局变量)来发送一个延迟消息
handler.postDelayed(new Runnable(){#####note:在有一个类继承Runnable(接口)Thread构建的时候,run()中的代码就会执行,
note:以下代码是API中对postDelayed进行描述:------》将一个runnable添加到消息队列中,当这个runnable当这个线程和handler关联的时候
Causes the Runnable r to be added to the message queue.
* The runnable will be run on the thread to which this handler is
* attached.
重写run(){
1)构建一个Intent对象,(大部分是用来启动一个BroadcastRecriver)
2)对于的事件处理
3)启动对于的组件事件(sendBroadcast or startAcitivity 获得是在启动一个服务),note:这里用到最多的就是发送一个BroadcastReceiver
4)如果想要不间断的进行数据交互的话,可以在匿名内部类里继续发延迟消息 handler.postDelayed(this, 1000);
}
})
note:对于service需要对其进行销毁,可以在onDestroy()进行处理
@Override
public void onDestroy() {
Log.d("TAG","服务被销毁");
handler.removeCallbacksAndMessages(null);
super.onDestroy();
}
这个方式:只是针对于利用Handler来发送消息
========================================================================================================================
由于在Service中每次都会启动一个Broadcast,将在Service中进行处理的数据发到Activity中,这就可以在Activity中利用一个BroadcastReceiver的实现类来接受数据 note:BroadcastReceiver是一个abstract的
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if("%%%%%".equals(action)){ note:%%%%%是在Service中利用Intent来进行封装的。
//从intent中,把数据取出来,放到指定的位置进行数据处理
//进行数据的处理
}
}
}
note:BroadcastReceiver是需要注册和注销
注册:@Override
protected void onResume() {
super.onResume();
receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();//构建广播的过滤器,由于在Android中有很多广播,这就需要对指定的intent中的封装的信息就行处理
filter.addAction("%%%%%");//对过滤器就行添加过滤广播类型
registerReceiver(receiver, filter);//注册广播
}
注销:@Override
protected void onPause() {
unregisterReceiver(receiver);//注销广播
super.onPause();
}
======================================================================
相关文章推荐
- CodeForces 673D Bear and Two Paths(构造)
- POJ 1904 强联通分量
- OSX上开启X11 client功能
- c++第五次实验——数组分离
- 汉诺塔问题的一种解决方法
- Red Hat Enterprise Linux 7 重置root密码
- 郑轻 1473 奇怪的排序
- 雷达数据扫描及聚类方法
- CodeForces 673C Bear and Colors
- LVS+Keepalived+Nginx+Tomcat部署实现
- [Effective JavaScript 笔记] 第6条:了解分号插入的局限
- 流的操作规律
- git使用详解
- qt读取注册表时重定向问题的解决
- python共享引用
- 非二元属性的关联规则挖掘和关联规则的评价
- Object类:品读API
- CodeForces 673A Bear and Game
- U盘中病毒后文件变为屏幕保护程序恢复方法
- TCP通讯实例两则