Activity与Service的交互二

Service与Activity交互的实现:通过Broadcast解耦 Service(服务)是Android平台上实现程序后台操作的重要组件,它可以在没有用户界面的情况下运行,执行长时间运行的操作。Service分为两种:前台服务和后台服务。前者通过通知栏通知用户,而后者则在后台默默无闻地完成任务。Broadcast是Android中组件间通信的一种方式,允许一个应用发布声明,让其他应用(或者应用的其他部分)能够接收并处理这个声明。Broadcast可以分为两种类型:普通Broadcast和有序Broadcast。 阅读详情

在上一篇文章中讲解了如何利用Messenger和Binder类来实现与Activity的通信,这次就讲解下其他的两种通讯方式。不管是哪一种通讯,我们首先需要创建一个Service,下面就先创建一个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.注册清单配置文件

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

一、使用广播通讯

在Android的系统中,广播是大家经常用到的组件,比如我们希望一个软件在开机的时候就自动重启,其实就是利用了系统启动时发出的广播,我们接受到这个广播就开始运行我们的程序。这里只会简单使用广播机制,不会过多的阐述广播的实现,有需要的话我会在以后另外贴出。下面就开始使用它来完成我们的通讯:

1.activity_main.xml

添加两个按钮便于测试

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

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick01"
        android:text="启动" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick02"
        android:text="停止" />

</LinearLayout>

2.MainActivity.java

创建内部类继承BroadcastReceiver来实现广播消息的处理,并在Activity加载时注册广播

public class MainActivity extends Activity {
	//用于测试数据
	private int count;
	//Service的Intent对象
	private Intent intent;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		intent=new Intent(this, MyService.class);
		//注册广播
		MyReceiver receiver=new MyReceiver();
		IntentFilter filter=new IntentFilter();
		filter.addAction("com.receiver");
		registerReceiver(receiver, filter);
	}
	/**
	 * 启动服务
	 * @param v
	 */
	public void onClick01(View v){
		startService(intent);
	}
	/**
	 * 停止服务
	 * @param v
	 */
	public void onClick02(View v){
		stopService(intent);
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		stopService(intent);
	}
	/**
	 * 内部内实现广播接口
	 * @author mm
	 *
	 */
	class MyReceiver extends BroadcastReceiver{
		@Override
		public void onReceive(Context context, Intent intent) {
			Log.i("Tag","count="+count++);
		}
	}
}

2.MyService.java

在service启动时,利用定时器不停的给Activity发送广播

public class MyService extends Service {
	private Intent intent;
	// 创建定时器对象
	private Timer mTimer;
	public MyService() {
	}
	/**
	 * 指定时间执行的任务类
	 * 
	 * @author mm
	 *
	 */
	class MyTimerTask extends TimerTask {
		@Override
		public void run() {
			Log.i("Tag", "sendBroadcast");
			// 发送广播
			sendBroadcast(intent);
		}
	}
	@Override
	public void onCreate() {
		super.onCreate();
		// 关联广播的Action
		intent = new Intent("com.receiver");
		mTimer = new Timer();
		// 每隔一秒发送一次广播
		mTimer.schedule(new MyTimerTask(), 0, 1000);
	}
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	/**
	 * service销毁时,关闭定时器mTimer
	 */
	@Override
	public void onDestroy() {
		super.onDestroy();
		mTimer.cancel();
	}
}

程序运行结果图:

二、使用AIDL交互

  AIDL是Android Interface Definition Language的首字母缩写, 也就是Android接口定义语言。AIDL属于Android的IPC机制,常用于跨进程通信,主要实现原理基于底层Binder机制。

1、创建AIDLService端

1.1IDataService.aidl

在指定包中,创建文件IDataService.aidl文件,内容如下:

package com.example.adilservice;//包名

interface IDataService{
//自定义方法
 String getData();
}
保存后会在gen目录下生成IDataService.java文件,如下图所示

1.2ADILService.java

创建ADILService,返回绑定参数

public class ADILService extends Service {

	class AIDLServerBinder extends IDataService.Stub {

		@Override
		public String getData() throws RemoteException {
			return "data on service";
		}
	}

	@Override
	public IBinder onBind(Intent intent) {
		return new AIDLServerBinder();
	}
}
运行程序,使该Service驻留在手机内

2、创建ADILClient端

在使用前需要将aidl文件文件拿过来,如下图所示


2.1.activity_main.xml

在布局文件中加入一个按钮。便于测试

 <Button 
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="talk"
       android:onClick="onClick"/>
2.2.MainActivity.java

public class MainActivity extends Activity {
	private IDataService iDataService;
	private ServiceConnection conn = new ServiceConnection() {
		//绑定异常执行
		@Override
		public void onServiceDisconnected(ComponentName name) {
		}
		//绑定成功执行
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			iDataService=IDataService.Stub.asInterface(service);
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	public void onClick(View v){
		String data=null;
		try {
			data=iDataService.getData();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		Log.i("Tag", "data="+data);
	}
	@Override
	protected void onStart() {
		super.onStart();
		bindService(new Intent("com.example.adilservice"), conn,
				BIND_AUTO_CREATE);
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		unbindService(conn);
	}
}

小结

service的数据交互到这就告一段落了,以后要有其他新的方法还会再次给出。如果有问题请帮忙指出 :)




Android Activity 与Service进行数据交互详解 ①从设计的角度来讲: Android的Activity的设计与Web页面非常类似,从页面的跳转通过连接,以及从页面的定位通过URL,从每个页面的独立封装等方面都可以看出来,它主要负责与用户进行交互。 Service则是在后台运行,默默地为用户提供功能,进行调度和统筹。如果一棵树的地上部分是Activity的话,它庞大的根须就是Service。Android的服务组件没有运行在独立的进程或线程中,它和其他的组件一样也在应用的主线程中运行,如果服务组件执行比较耗时的操作就会导致主线程阻塞或者假死,从而无法响应用户的操作。 因此,耗时的操作不要放在UI线程中,因为UI 5S,广播10s就阻塞了, 立即下载

相关推荐

Service Activity的三种交互方式(详解)

下面小编就为大家带来一篇Service Activity的三种交互方式(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

条码扫描二维码扫描——ZXing android 源码简化

前言   最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个以Apache License 2.0开源的ZXing项目。Zxing项目里的Android实现太过复杂多余东西太多,得对其进行简化。 前提条件   下载源代码:点击这里   编译核心库:Zxing的主页上有介绍具体步骤,大家也可以参照这篇博文:android 条码识别软件开发全解析(续...

weixin_30593261的博客 389

RT-Thread Studio与CubeMX联合编程(超级详细)

RT-Thread Studio与CubeMX联合编程 本文章参考以下文章: https://blog.csdn.net/qq_40824852/article/details/122596043 https://zhuanlan.zhihu.com/p/395106066 https://blog.csdn.net/m0_37697335/article/details/108890584 一、简介 经过上次对RT-Thread Studio的初步尝试,发现RT-Thread Studio中存在官方支

zhuzhu的博客 3万+

ARouter——原理分析整理

文章目录单向依赖的module互不依赖的moduleARouter概述apt & javapoet路由映射文件生成原理定义注解使用注解注解处理器使用javapoet生成java类路由跳转 单向依赖的module 组件化中两个单向依赖的module之间需要互相启动对方的Activity时,因为没有相互引用,startActivity()是实现不了的,必须需要一个协定的通信方式,此时类似ARo...

PdKingLiu 3604

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)

本文借助easyx库函数(提供下载链接),很方便地用C语言实现了鼠标、按钮、进度条、坐标尺等操作,为普通C程序的友好人机交互界面提供了一种简单便捷的方案。

体会编程语言独到的美 17万+

从IMU到机器人定位:手把手教你用ESKF(Error-State Kalman Filter)搞定传感器融合

本文详细介绍了如何使用ESKF(Error-State Kalman Filter)实现IMU与多传感器的融合,解决机器人定位中的积分漂移问题。通过代码示例和Gazebo仿真案例,展示了ESKF在自动驾驶和移动机器人中的核心应用,包括误差状态建模、预测过程实现和观测更新策略,帮助开发者掌握这一高效滤波技术。

weixin_33275503的博客 281

Android 进阶 - Activity服务启动分析

上篇文章已经wj 本文将从一个Activity客户端

szzhaom的专栏 4442

使用TensorFlow搭建FNN(全连接神经网络)的基本步骤

提示:转载请注明出处,若本文无意侵犯到您的合法权益,请及时与作者联系。 目录 一、定义神经网络的输入输出 二、搭建神经网络 1、定义一个神经层中的权重 2、定义一个神经层中的阈值 3、定义一个神经层中的激活函数 4、组合神经层为神经网络 三、搭建损失函数和优化器 1、搭建损失函数 首先介绍第一个函数这其中用到的共同的函数为 2、定义优化器 四、训练神经网络 全连接神经网络的网络结构如下: 一、定义神经网络的输入输出 神经网络最擅长的工作就是模拟非线性函数,即一个复杂的高..

qq_41959920的博客 4070

Android 菜鸟进击之路 (5)Activity 未完待续

参考学习地址: https://www.runoob.com

weixin_43892021的博客 261

保姆级教程:在树莓派5B上用AI Kit跑YOLOv8,实测134fps的完整配置流程

本文提供了一份详细的树莓派5B搭配AI Kit部署YOLOv8的教程,从硬件组装到模型转换、优化和部署,最终实现134FPS的高帧率推理性能。通过Hailo-8L AI加速模块和HEF模型转换,这套方案为边缘AI计算提供了强大支持,适用于智能监控、无人机视觉导航等应用场景。

weixin_28725407的博客 446

ICCompiler II学习笔记(一)ICC II使用全流程 overview

学习笔记同步发布在我的个人网站上,欢迎来访查看。 个人学识有限,理解可能有误,仅供参考。 文章目录一、前言二、 ICC II 简介和 GUI2.1 Blocks 和 Design Libraries2.2 Objects2.3 Application Options三、Design Setup四、APR flow五、 课程主题:如何用 ICC II来实现最好的PPA 一、前言 现在的芯片都在追求一个极致的PPA 芯片的生成可以分为以下 5大步骤: Front-end Design:前端设计,最终产生

一名FPGA芯片设计爱好者的技术博客 2万+

Android activity/service 开机启动

1. 在AndroidManifest.xml中添加权限和监听的intent. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.oms.netwapswitch" android:versionCode="1" android:versionN

阿强的一亩三分地,一分耕耘一分收获 1422

使用CloudCompare和CANUPO进行点云分类的编程指南

在本文中,我们将介绍如何使用CloudCompare和CANUPO库进行点云分类的编程。CloudCompare是一款功能强大的开源点云处理软件,而CANUPO是一个用于点云分类和分割的C++库。这只是一个简单的点云分类示例,CANUPO库还提供了其他更高级的功能和算法,以满足各种点云分类需求。该函数接受点云数据、地面点掩码和非地面点掩码作为输入,并将分类结果存储在这两个掩码向量中。完成安装后,我们可以开始编写点云分类的代码。最后,我们遍历点云数据,并根据地面点和非地面点的掩码将结果打印出来。

ByteWhisper的博客 1058

Service如何关闭启动自己的Activity

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

huobengluantiao8 304

【STK】手把手教你利用STK进行导弹和反导仿真04 - STK/MMT模块03 导弹飞行工具应用案例

飞行设置的工具栏就在附加窗口的中间,首先点击左边的General,修改这个项目的名字。然后在下拉的System中选择导弹的类型,这里我们选择远程。(4)输出数据文件到STK,任务窗口里选择Export Manager项,飞行数据输出到STK。项目可以命名为Test;(1)首先建立新项目,点击Flight菜单中的New Flight选项,见下图。首先看世界地图中间的红圈,是一个导弹形状的图标,这个图标表示的是导弹的发射点。选择下面的Export Manager,依次勾选红框的选项。我们拖动这个导弹的图标,

weixin_44184852的博客 1630

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

农展飞的博客 1074

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Activity和Service的交互

Running&H的博客 334

android service交互,Android Activity与Service的交互方式

参考:http://blog.csdn.net/gebitan505/article/details/18151203实现更新下载进度的功能1. 通过广播交互Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上。优缺点分析:通过广播的方式实现Activity与Service的交互操作简单且容易实现...

weixin_33190667的博客 1168

Activity如何与Service通信?

目录直接new 一个Service对象,然后mService.setValue()不行吗?如何在Activity中获取一个已创建的Service对象?Activity与Service通信的方式有哪些? 直接new 一个Service对象,然后mService.setValue()不行吗? 不行,因为Service从创建到启动涉及到新进程创建和跨进程通信,应用层自己写任务量很大。 Service的启动流程: Process A进程采用Binder IPC向system_server进程发起startServ

知道这个有什么用? 3807

Activity和Service之间的交互

交互的原理: activity 和 service中各自定义一个handler,通过过messenger类来转化IBinder或是Handler,最后在handler中处理消息: 代码涉及的页面比较多,不能将过程完整展示,现将关键实现过程做说明: 1.activity和service中各定义一个Handler 和 Messenger service中的定义的如下: private

huang_xiao_yu的博客 1550

如何将service与activity绑定

一、 service的简单使用就不详细展开了。只做一点儿讨论以解释为什么要绑定activity。 service是不可见的,它的启动、停止和其他控制操作都是通过其他应用程序组件来实现的。 比如最简单的就是在activity中使用startService()来启动一个服务,使其在后台运行。但如果仅仅是这样的话,我们启动一个service后就只能看着它在后台运行却不能对其进行任何操作了。如果想在

思念叨火车的专栏 5607

Android中程序与Service交互的方式——交互方式

上一篇文章:Android中程序与Service交互的方式——综述 简述了Service的一些基础知识以及Service和Thread的简单区别,本文将着重讲解与Service交互的五种基本方式:广播交互、共享文件交互、Mssenger(信使)交互、自定义接口交互、AIDL交互。        1. 广播交互        提到Activity与Service的交互,可能狠多人首先想到的就是B

Keep Awake,Keep Studying,Keep Moving,Keep... 4万+

Activity和Service交互

Activity和Service的几种不同交互

随意而然的专栏 718

Service与Activity交互之IPC

如题,有个场景就是,在Service中进行文件上传,监听上传的各种情况,且上传不能够影响应用。本次就拿FTP吧。   首先想到远程服务(Remote Service)。   接下来,直接上代码,步骤:   1、编写AIDL   interface IFileUploadServices { /** * Demonstrates some basic types that y

梦江月 473

Activity与Service的交互一

服务(Service) 是一种在后台运行,没有界面的组件,由其他组件调用开始。当我们需要在后台进行一些操作时我们就可以用到Service。那么如何对将需要的数据在Activity和Service之间进行交互呢?下面就简单介绍两种常见的方法。 Service创建 1.创建MySerVice类继承Service并重写相关方法 public class MyService extends Se

ForgetFormerly的博客 560
上一篇: Activity与Service的交互一
下一篇: 完美实现tab和Fragment的联动效果
ForgetFormerly
博客等级 码龄12年 9粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值