`

Activity和Service之间通讯的Demo

阅读更多
1.Activity的类别文件:
package wyf.wpf;//声明包语句

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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
//继承自Activity的子类

public class Sample_3_6 extends Activity {
	public static final int CMD_STOP_SERVICE = 0;
	Button btnStart;// 开始服务Button对象应用
	Button btnStop;// 停止服务Button对象应用
	TextView tv;// TextView对象应用
	DataReceiver dataReceiver;// BroadcastReceiver对象

	@Override
	public void onCreate(Bundle savedInstanceState) {// 重写onCreate方法
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);// 设置显示的屏幕
		btnStart = (Button) findViewById(R.id.btnStart);
		btnStop = (Button) findViewById(R.id.btnStop);
		tv = (TextView) findViewById(R.id.tv);
		
		btnStart.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent myIntent = new Intent(Sample_3_6.this,
						wyf.wpf.MyService.class);
				startService(myIntent);// 发送Intent启动Service
			}
		});
		
		btnStop.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent myIntent = new Intent();
				myIntent.setAction("wyf.wpf.MyService");
				myIntent.putExtra("cmd", CMD_STOP_SERVICE);
				sendBroadcast(myIntent);// 发送广播
			}
		});
	}

	private class DataReceiver extends BroadcastReceiver {// 继承自BroadcastReceiver的子类
		@Override
		public void onReceive(Context context, Intent intent) {// 重写onReceive方法
			double data = intent.getDoubleExtra("data", 0);
			tv.setText("Service的数据为:" + data);
		}
	}

	@Override
	protected void onStart() {// 重写onStart方法
		dataReceiver = new DataReceiver();
		IntentFilter filter = new IntentFilter();// 创建IntentFilter对象
		filter.addAction("wyf.wpf.Sample_3_6");
		registerReceiver(dataReceiver, filter);// 注册Broadcast Receiver
		super.onStart();
	}

	@Override
	protected void onStop() {// 重写onStop方法
		unregisterReceiver(dataReceiver);// 取消注册Broadcast Receiver
		super.onStop();
	}
}

2.服务的类:
package wyf.wpf;//声明包语句

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
//继承自Service的子类

public class MyService extends Service {
	CommandReceiver cmdReceiver;
	boolean flag;

	@Override
	public void onCreate() {// 重写onCreate方法
		flag = true;
		cmdReceiver = new CommandReceiver();
		super.onCreate();
	}

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

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {// 重写onStartCommand方法
		IntentFilter filter = new IntentFilter();// 创建IntentFilter对象
		filter.addAction("wyf.wpf.MyService");
		registerReceiver(cmdReceiver, filter);// 注册Broadcast Receiver,后续会接收相关广播intent
		doJob();// 调用方法启动线程
		return super.onStartCommand(intent, flags, startId);
	}

	// 方法:
	public void doJob() {
		new Thread() {
			public void run() {
				while (flag) {
					try {// 睡眠一段时间
						Thread.sleep(1000);
					} catch (Exception e) {
						e.printStackTrace();
					}
					Intent intent = new Intent();// 创建Intent对象
					intent.setAction("wyf.wpf.Sample_3_6");
					intent.putExtra("data", Math.random());
					sendBroadcast(intent);// 发送广播
				}
			}

		}.start();
	}

	private class CommandReceiver extends BroadcastReceiver {// 继承自BroadcastReceiver的子类
		@Override
		public void onReceive(Context context, Intent intent) {// 重写onReceive方法
			int cmd = intent.getIntExtra("cmd", -1);// 获取Extra信息
			if (cmd == Sample_3_6.CMD_STOP_SERVICE) {// 如果发来的消息是停止服务
				flag = false;// 停止线程
				stopSelf();// 停止服务
			}
		}
	}

	@Override
	public void onDestroy() {// 重写onDestroy方法
		this.unregisterReceiver(cmdReceiver);// 取消注册的CommandReceiver
		super.onDestroy();
	}
}

最后是配置文件和main.xml,每个Service都需要在配置文件里申明标签:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="wyf.wpf" android:versionCode="1" android:versionName="1.0">
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".Sample_3_6" android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
		<service android:name=".MyService" android:process=":remote">
			<intent-filter>
				<action android:name="wyf.wpf.MyService" />
			</intent-filter>
		</service>
	</application>
	<uses-sdk android:minSdkVersion="7" />

</manifest> 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<Button android:id="@+id/btnStart" android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="启动服务" />
	<Button android:id="@+id/btnStop" android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="停止服务" />
	<TextView android:id="@+id/tv" android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="等待来自Service的数据" />
</LinearLayout>
分享到:
评论

相关推荐

    android蓝牙demo实现通讯功能

    总结起来,实现“android蓝牙demo实现通讯功能”涉及的关键技术点包括:BroadcastReceiver监听蓝牙状态变化,Service处理蓝牙连接和数据传输,以及Activity与Service之间的通信。通过学习这些内容,你可以构建一个...

    Android 数据存储和组件通讯Demo

    Android 应用由四大组件构成:Activity、Service、BroadcastReceiver 和 ContentProvider。它们之间的通信是Android应用设计的核心。 1. **Intent**:Intent 是组件间通信的主要手段,它可以启动一个Activity或...

    Android 即时通讯demo.zip

    本"Android即时通讯demo.zip"包含了一个基于Java的示例项目,它提供了如何在Android上搭建即时通讯系统的基础框架。下面我们将详细探讨相关的知识点。 1. **Android SDK和开发环境** - Android Studio是Google提供...

    android 串口通讯demo

    6. **示例用法**:可能包含一个简单的Activity或Service,演示如何在应用程序中启动和使用串口通信功能。 通过这个"android 串口通讯demo",开发者可以学习到如何在Android应用中设置并控制串口,以及如何使用JNI...

    声波通讯demo

    在这个声波通讯demo中,可能需要声明使用麦克风和扬声器的权限,例如: ```xml ``` `src`目录包含项目的源代码,通常分为多个包(package),每个包内有对应的类文件。在声波通讯中,可能会有一个专门处理声波...

    android Aidl 客户端和服务端Demo

    "AIDLDemo"可能包含服务端接口定义(.aidl文件)及对应的实现,客户端的调用代码,以及必要的Activity或Service来启动和管理服务。而"AIDLDemoGet"可能是一个具体的功能模块,用于从服务端获取数据。 在实际操作中...

    Android 组件化demo

    1. **模块化(Module)**:模块是应用的基本构建单元,每个模块都有明确的功能,如:Activity、Service、BroadcastReceiver等。模块之间通过接口进行通信,降低耦合度。 2. **依赖注入(Dependency Injection, DI)...

    聊天通信工具demo

    项目是Android应用,因此会涉及到Android SDK、Android Studio的使用,以及对Android的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的理解。开发者需要熟悉XML布局、Java或Kotlin编程语言,...

    webrtc android Demo

    压缩包中的文件"webrtc_demo"很可能包含了上述所有步骤的实现代码,包括Activity、Service、BroadcastReceiver等组件的使用,以及必要的媒体处理类(如VideoCapturer、VideoSource、VideoTrack等)和网络信令处理类...

    服务通信方案总结

    本篇文章将深入探讨“服务通信方案总结”,主要包括服务端的实现、客户端通过AIDL(Android Interface Definition Language)进行进程间通信、Activity与Service之间的通信以及Parcel的使用和接口回调机制。...

    DEMO-EventBus通讯工具的使用

    EventBus常用于组件间的通信,例如Activity、Fragment、Service之间的数据传递,以及网络请求完成后的通知等。 10. **DEMO解析** 该DEMO可能包含了一个简单的Android项目,展示了如何集成EventBus,包括注册、...

    lumaqq for android demo

    在构建LumaQQ for Android Demo时,开发者需要掌握Android应用的基本架构,包括Activity、Service、BroadcastReceiver和ContentProvider等核心组件。此外,对于UI界面的设计,需使用XML布局文件和Java代码进行交互...

    云信纯聊天demo,去除多余资源

    3. **配置文件**:如AndroidManifest.xml,只包含必要的权限声明和Activity、Service等组件。 4. **依赖库**:云信SDK的核心库,可能已经过裁剪,仅保留聊天功能所需的组件。 5. **示例代码**:用于展示如何初始化...

    localService

    综上所述,`LocalService` 是一个自定义服务,用于在应用的各个组件之间进行内部通信。结合`Notification` 和适当的配置,可以在应用退出后依然接收并处理消息,即使设备被锁定,也能通过点亮屏幕和显示通知来提醒...

    android studio基于XMPP,Openfire,Smack聊天demo

    1. `AndroidManifest.xml`:应用配置文件,声明权限、活动(Activity)、服务(Service)等。 2. `MainActivity.java`:主活动类,可能包含登录、聊天界面的初始化。 3. `XMPPConnection.java`:使用Smack库建立和...

    安卓 openfire demo

    【Android Openfire Demo详解】 Openfire是一款开源的即时通讯服务器软件...通过以上知识点的学习和实践,开发者可以构建出一个功能完备、用户体验良好的Android Openfire Demo,为即时通讯应用的开发打下坚实的基础。

    仿iphone 气泡短信 DEMO

    5. `AndroidManifest.xml`:这是Android应用的核心配置文件,包含了应用的基本元数据、权限声明、活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider)的定义。...

    YTX_Android_Full_Demo.zip

    因此,这个Demo可能基于容联云通讯的SDK,包含了它们提供的服务和技术。 在【压缩包子文件的文件名称列表】中,我们只有一个文件"YTX_Android_Full_Demo",这很可能是整个项目的源代码目录,包含以下几个部分: 1....

    Android多进程通讯MessengerDemo

    本篇文章将深入探讨如何使用Messenger实现Android多进程通讯,以及其背后的原理和实践应用。 首先,让我们了解什么是Messenger。Messenger是Android中的一个类,它基于Binder机制,用于在不同进程间传递消息。与...

    Android基于局域网socket通信

    在Android中,由于安全性和权限限制,通常需要在主线程之外(例如在一个后台线程或Service中)创建ServerSocket。 2. **客户端连接**:在客户端,我们使用Socket类的构造函数,传入服务器的IP地址和端口号,尝试...

Global site tag (gtag.js) - Google Analytics