Activity与Service的交互一

浅谈Android Activity与Service的交互方式 实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上。 优缺点分析: 通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用。但缺点也十分明显,发送广播受到系统制约。系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟。同时在广播接收器中不能处理长耗时操作,否则系统会出现ANR即应用程序无响应 2. 共享文件交互 这里提到的共享文件指的是Activity和Service使用同一个文件来达到 立即下载

服务(Service) 是一种在后台运行,没有界面的组件,由其他组件调用开始。当我们需要在后台进行一些操作时我们就可以用到Service。那么如何对将需要的数据在Activity和Service之间进行交互呢?下面就简单介绍两种常见的方法。

Service创建

1.创建MySerVice类继承Service并重写相关方法

public class MyService extends Service {
	public MyService() {
	}

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	
}

2.在清单文件中注册

打开AndroidManifest.xml文件,添加如下内容

<application>
...
<service android:name=".MyService" />
</application

一、使用Binder接口

使用Binder接口需要创建一个类去实现它,自己去添加一个方法用于获取Service对象。Activity中绑定Service时,就可以通过此方法获取到Service对象,得到service了那我们还不是想干哈就干哈啦。下面是实现代码:

1.activity_main.xml

在布局文件中添加了两个按钮便于测试

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.servicedemo.MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick01"
        android:text="从Service中获取数据" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick02"
        android:text="从Activity获取数据" />

</LinearLayout>

2.MainActivity,java

在Activity创建时绑定Service,借助ServiceConnection来监听绑定是否成功,最后销毁时解绑Service

public class MainActivity extends Activity {
	private MyService service;
	private ServiceConnection conn=new ServiceConnection() {
		//绑定异常时执行
		@Override
		public void onServiceDisconnected(ComponentName name) {
			
		}
		//绑定完成时执行
		@Override
		public void onServiceConnected(ComponentName name, IBinder iBinder) {
			MyBinder binder=(MyBinder) iBinder;
			service=binder.getMyService();
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	public void onClick01(View v){
		Log.i("Tag", "activity.show="+service.ServiceData());
	}
	public void onClick02(View v){
		service.Show("activity中的数据");
	}
	@Override
	protected void onStart() {
		super.onStart();
		//绑定Service
		Intent intent=new Intent(this, MyService.class);
		bindService(intent, conn, BIND_AUTO_CREATE);
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		//解绑Service
		unbindService(conn);
	}
}
3.MyService.java

创建MyBinder类来传输MyService对象

public class MyService extends Service {
	public MyService() {
	}
	//创建一个内部类继承Binder接口,使用MyBinder类来传输MyService对象
	public class MyBinder extends Binder{
		public MyService getMyService(){
			return MyService.this;
		}
	}
	public String ServiceData(){
		return "Service中的数据";
	}
	public void Show(String data){
		Log.i("Tag","service.show="+ data);
	}
	//绑定时执行此方法
	@Override
	public IBinder onBind(Intent intent) {
		return new MyBinder();
	}
	
}

实现效果

二、使用Messenger类

与上一个方法不同的是,Messenger中封装了Binder对象,就不用再创建一个Binder对象。但麻烦的是创建Messenger对象时需要传入一个Handler,用于对接收到的消息处理,并且在activity和service都需要一个Messenger对象来传递消息。具体的实现如下:

1.activity_main.xml

和上一个布局页面一样,这里就不重复补充了

2.MainActivity.java

public class MainActivity extends Activity {
	//service的送信人
	private Messenger serviceMessenger;
	//activity的送信人
	private Messenger activityMessenger;
	private ServiceConnection conn=new ServiceConnection() {
		//绑定异常时执行
		@Override
		public void onServiceDisconnected(ComponentName name) {
			
		}
		//绑定完成时执行
		@Override
		public void onServiceConnected(ComponentName name, IBinder iBinder) {
			serviceMessenger=new Messenger(iBinder);
		}
	};
	//用于处理消息
	class ActivityHandler extends Handler{
		@Override
		public void handleMessage(Message msg) {
			Log.i("Tag", "Activity:"+msg.obj);
		}
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		activityMessenger=new Messenger(new ActivityHandler());
	}
	//发送消息和数据给service并显示
	public void onClick01(View v){
		Message msg=Message.obtain();
		msg.what=1;
		msg.obj="hello!";
		try{serviceMessenger.send(msg);}catch(Exception e){e.printStackTrace();}
	}
	//发送消息给service并返回数据显示
	public void onClick02(View v){
		Message msg=Message.obtain();
		msg.what=2;
		msg.replyTo=activityMessenger;
		try{serviceMessenger.send(msg);}catch(Exception e){e.printStackTrace();}
	}
	
	@Override
	protected void onStart() {
		super.onStart();
		//绑定Service
		Intent intent=new Intent(this, MyService.class);
		bindService(intent, conn, BIND_AUTO_CREATE);
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		//解绑Service
		unbindService(conn);
	}
}

2.MyService.java
public class MyService extends Service {
	public MyService() {
	}
	class ServiceHandle extends Handler{
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				Log.i("Tag", "MyService:"+msg.obj);
				break;
			case 2:
				//发送回消息给activity
				Message message=Message.obtain();
				message.obj="hello!";
				try{msg.replyTo.send(message);}catch (Exception e) {
				e.printStackTrace();
				}
				break;
			default:
				break;
			}
		}
	}
	
	//绑定时执行此方法
	@Override
	public IBinder onBind(Intent intent) {
		return new Messenger(new ServiceHandle()).getBinder();
	}
	
}

实现效果:

总结

第一次写博客,也不知道怎么写,就把自己学的东西稍微总结了下写了下来,希望能对大伙有帮助,有什么不对的地方也请各位大牛指点指点。谢谢~




Android Activity 与Service进行数据交互详解 主要介绍了Android Activity 与Service进行数据交互的相关资料,在开发Android App的时候经常会使用这样的功能,需要的朋友可以参考下 立即下载

相关推荐

vivado 编译ADI AD9361 TCL脚本生成hdl工程

(4)输入"source ../../scripts/adi_make.tcl"命令(仅双引号内部命令,不包含双引号),个人理解:该命令用来加载当前所需要编译工程所需要各功能模块的信息,因为每个工程需要不同的功能模块,比如有的需要gpio模块,有的不需要gpio模块,这些模块上前面路径的library也同样以TCL脚本形式存在,当有需要时才进行编译,怎么知道当前工程需要什么模块呢就是通过"source ../../scripts/adi_make.tcl"(仅双引号内部命令,不包含双引号)命令实现。

weixin_40586423的博客 807

Activity和Service的交互方式

Activity向Service通信 第一种方式:通过MyBinder方式调用Service方法 步骤 继承Binder 定义中间人对象 BanZhengService public class BanZhengService extends Service { //把我定义的中间人对象返回 @Override public IBinder onBind(Intent intent) { return new MyBinder(); } //办

Grekit_Sun的博客 2348

SECS/GEM协议库及开源代码

以下是在开发SECS/GEM协议过程中,在网络上搜集协议实现资源,希望对SECS/GEM协议感兴趣的同学能有所帮助。 开源代码 freesecs FREESECS 是一个开源的SEMI SECS协议库,采用C++语言实现,可运行于Linux, MacOS X, NetBSD。 实现协议:E37.1、E5 开源地址:freesecs download | SourceForge.net 下载地址:https://download.youkuaiyun.com/download/BT_LEO/24305429

码农的历程 9936

Activity和Service交互方式探讨

目录 需求定义 方式一:广播(Broadcast) 方式二:bindService-接口回调 方式三:startService和bindService混合双打 方式四:单例传值 方式五:配合系统级别服务 其它方式 需求定义 假设一个设备具备装备了湿度传感器,可通过监测真实环境的湿度值来工作(如市面上的除湿设备),用户要求:除湿工作全自动化,无需人工干预,除非断电关机,否则永远在后台运行;有一个用户界面,打开可以查看当前环境的湿度值以及设备的工作状态(是否在进行除湿工作)。针对这些需求,得到

visionliao的专栏 619

用AI+Playwright实现零代码UI自动化测试:以登录页面为例的实战指南

本文详细介绍了如何利用AI与Playwright结合实现零代码UI自动化测试,特别以登录页面为例进行实战演示。通过自然语言描述生成测试脚本,大幅降低技术门槛,提升测试效率,并支持跨浏览器验证。适合非技术人员快速上手专业级自动化测试。

weixin_28842269的博客 401

LEAP模型—低排放分析平台

LEAP 正在迅速成为进行综合资源规划、温室气体 (GHG) 缓解评估和低排放发展战略 (LEDS) 的国家的事实标准,尤其是在发展中国家,许多国家也选择使用 LEAP 作为其承诺的一部分向联合国气候变化框架公约(UNFCCC)报告。至少有 32 个国家使用 LEAP 来创建能源和排放情景,这些情景是其国家自主气候变化贡献计划 (INDC) 的基础:具有历史意义的巴黎气候协议的基础旨在表明各国开始经济脱碳的意图和投资于气候适应力。

weixin_54697010的博客 3280

Service和Activity之间的交互

本地服务的交互 1.通过发送广播的方式进行消息传递 实现原理:    server端当有内容需要传递时,可以发送一条广播,而client端可以注册一个广播接收者去接收广播信息,    根据内容做相关的操作。 小结:    通过广播的方式来实现activity和service的交互是非常简单而且容易实现的,一般可以胜任轻量级的应用。  它的缺点也比较明显,发送的广播会受到系统的制约,系

Android 955

华为OD机试 - 不含101的数(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。小明在学习二进制时,发现了一类不含101的数,也就是:现在给定一个正整数区间,请问这个区间内包含了多少个不含101的数?输入的唯一一行包含两个正整数。输出的唯一一行包含一个整数,表示在区间内一共有几个不含101的数。8 1668 → “1000”

学Java,找哪吒 1250

Activity和Service的交互

Running&H的博客 334

【FISCO BCOS】二十、多机部署区块链

实际开发中,为了满足高可用性和高容错性的需求,往往会采用多级部署区块链的方式,今天介绍一下FISCO BCOS的多机部署流程。

naihe_fish的博客 3651

第十四节《OpenCascade集成Qt》

将 OpenCascade 与 Qt 集成是开发图形界面应用的常见需求。通过将 OpenCascade 的几何建模与 Qt 的图形用户界面(GUI)功能结合,可以创建强大而灵活的 CAD 或建模工具。OpenCascade 提供了与 Qt 的集成接口,允许你在 Qt 应用程序中嵌入 OpenCascade 的视图,执行几何操作,并与用户进行交互。以下是 OpenCascade 与 Qt 集成的详细步骤:首先,确保已安装 OpenCascade 和 Qt。你可以从 OpenCascade 官方网站或通过包管理

yumeiguo的博客 597

Activity与Service交互(一)

方法一: 使用ASB模型 1.Activity启动Service 2.Service发送广播 3.在Activity上注册BroadcastReceiver接受广播 public class MainActivity extends Activity { TextView tv; MyReceiver receiver; @Override protected void

Grindstone_Fos的博客 892

华为OD机试双机位C卷-虚拟文件系统(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【虚拟文件系统】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【虚拟文件系统】。

qq_45776114的博客 476

android activity与service交互,Android的Activity和Service的三种数据交互方式,第一种:同一app(进程)内的...

使用IBinder作为交互媒介方法概述Activity端使用bindService的方式来绑定需要交互的Service,通过Service里面的bind方法来返回IBinder,进而返回Service的实例到Activity,Activity里面使用ServiceConnection类里面的回调方法来接收IBinder,并转换成Service实例。Service代码示例public class M...

weixin_32831351的博客 699

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行...

前言: 近期在写一个小程序,需求是手机摇一摇就弹窗出来。第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行。满足了自己的需求。现记录学习心得。希望能给你带来一些帮助。 1.Service创建:重写4个方法 onBind():返回一个IBinder对象,这个对象能够使应用程序与Se...

weixin_30297281的博客 100

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Service如何关闭启动自己的Activity

今天在编写Android程序的时候,遇到这个问题。通过百度和google的搜索结果,总结出以下方法:方法一:public classmServiceextendsService{//保存在service中的Activity对象 private static mActivity m;//启动服务 static voidstartservice(Context c){ m=(mActivity)c; ...

huobengluantiao8 304

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Activity与Service之间交互并播放歌曲

Activity与Service之间交互并播放歌曲,为了方便,我把要播放的歌曲定死了,大家可以灵活改进 MService: View Code MusicPlayActivity: View Code 本文转自天天_byconan博客园博客,原文链接:http://www.cnblogs.com/tiantianbyconan/arc...

weixin_33672400的博客 143

AMS和应用程序的交互分析

如果不是跨进程,AMS和应用程序之间的调用会比较简单。但是由于AMS和应用程序之间属于不同进程,那么之间的交互是通过Binder机制来交互的。现在具体分析一下。 首先Activity与AMS交互。 Activity与AMS的交互方法我们可以从startActivity开始分析。最终会进入 int result = ActivityManagerNative.getDefault() .startActivityAsUser(whoThread, who.getBasePackage

d_o_n_g2的博客 246

android static达到Service与Activity于Handler沟通

供static理解力,仅适用于static理解力,不喜勿喷 第一种方式:离Service中获取Activity的static变量,调用该静态变量的getHandler()获取Handler进行发送消息 MainActivity: package com.example.test; import android.support.v7.app.ActionBarActivity; ...

weixin_34212762的博客 106

利用Service实现背景音乐的播放

Android允许我们使用Service组件来完成后台任务,这些任务的允许不会影响到用户其他的交互。1、Activity类  view plaincopy to clipboardprint?01.package demo.camera;  02.import android.app.Activity;  03.import android.content.ComponentName;

fulianwu的专栏 1201

同进程Activity调用Serivce中函数(学习笔记四)

Activity与Service间通信的代码不是没写过,但是并没有了解过为啥会这样写,先记录一下。 首先得先了解一下AMS,AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。 1、IBinder存在的意义,myActivity和myService是谁来...

TouchOfSun的博客 231

Android四大组件 - Service使用解析

Service是Android实现程序后台任务的解决方案,非常适合处理一些不需要与用户交互但又要长期运行的任务。但不要被它的“后台”二字所欺骗,Service默认并不是运行在子线程中的,他同样和Activity一样运行在UI线程。所以需要在Service中执行耗时操作时,必须创建一个子线程来完成。 1. Service生命周期 Service的生命周期比Activity来说简单得多,只有3个,分别...

小仓猪的博客 286

"activity和service通信"-三大方法之-继承Binder类

1.服务类新建一个类 2.里面有一个方法返回值是Binder 3.Activity就能获取和调用了

农展飞的博客 1074

Android Service 服务(一)—— Service

一、 Service简单介绍Service是android 系统中的四大组件之中的一个(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差点儿相同,但不能自己执行仅仅能后台执行,而且能够和其它组件进行交互。service能够在非常多场合的应用中使用,比方播放多媒体的时候用户启动了其它Activity这个时候程序要...

weixin_33946605的博客 87
下一篇: Activity与Service的交互二
ForgetFormerly
博客等级 码龄12年 9粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值