Android广播传值,分为两个方面:广播发送者和广播接收器;
发送广播主要通过sendBroadcast(intent)方式进行;接收器即BroadcastReceiver类;
Android广播主要用到的场景:
1.同一app内部的同一组件内的消息通信(单个或多个线程之间);
2.同一app内部的不同组件之间的消息通信(单个进程);
3.同一app具有多个进程的不同组件之间的消息通信;
4.不同app之间的组件之间消息通信;
5.Android系统在特定情况下与App之间的消息通信。
下面照例,列个简单的例子,Activity与Service之间传值,从Service发送广播至Activity:
首先在SocketService需要传值的地方sendBroadcast(intent);然后在Activity中注册广播接收器及具体类的实现。
发送广播的Service:SocketService.java
package com.example.socketserverdemo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.TextView;
public class SocketService extends Service{
Thread mServiceThread;
UserAndPassword mUserAndPassword;
Socket client;
String textLine,editText ;
TextView textView;
@Override
public void onCreate() {
System.out.println("执行onCreate()");
super.onCreate();
mServiceThread = new Thread(new SocketServiceThread());
}
@Override
public void onStart(Intent intent, int startId) {
mServiceThread.start();
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("执行onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
System.out.println("执行onDestroy()");
super.onDestroy();
}
public class SocketServiceThread extends Thread{
private static final int PORT = 54321;
private SocketServiceThread(){}
@Override
public void run() {
ServerSocket server;
System.out.println("service begin!!!");
try {
server = new ServerSocket(PORT);
while(true){
client = server.accept();
System.out.println("服务器端监听,连接到客户端!!");
BufferedReader reader = new BufferedReader(
new InputStreamReader(client.getInputStream()));
System.out.println("读取到从客户端发来的信息!!");
textLine = reader.readLine();
//发送广播
Intent intent = new Intent();
intent.putExtra("textLine", textLine);
intent.setAction("com.example.socketserverdemo.SocketService");
sendBroadcast(intent);
if(textLine.equalsIgnoreCase("EXIT")){
System.out.println("EXIT invoked, closing client");
break;
}
System.out.println(textLine);
PrintWriter writer = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(client.getOutputStream())));
System.out.println("edit值为:"+editText);
writer.println("服务器端传来消息"+editText);
writer.flush();
writer.close();
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
public interface UserAndPassword{
public String getUser();
public String getPassword();
}
}
package com.example.socketserverdemo;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import com.example.socketserverdemo.SocketService.UserAndPassword;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class SocketServerDemo extends Activity implements UserAndPassword {
private TextView view;
private EditText edit;
private String editText,textViewTextServer=null;
private Button btn;
private MyReceiver receiver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println(getLocalIpAddress());
view = (TextView) findViewById(R.id.view);
edit = (EditText) findViewById(R.id.edit);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new MyOnClickListener());
//注册广播
receiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.socketserverdemo.SocketService");
registerReceiver(receiver, intentFilter);
this.startService(new Intent(this,SocketService.class));
}
public class MyOnClickListener implements OnClickListener{
@Override
public void onClick(View v) {
editText = edit.getText().toString();
edit.setText(null);
}
}
//广播接收器
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
String textLine = bundle.getString("textLine");
textViewTextServer = textViewTextServer +"\n"+ textLine;
view.setText("客户端传来消息:"+textViewTextServer);
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
this.stopService(new Intent(this,SocketService.class));
}
public String getLocalIpAddress()
{
try
{
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)
{
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();)
{
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()&& !inetAddress.isLinkLocalAddress())
{
return inetAddress.getHostAddress().toString();
}
}
}
}
catch (SocketException ex)
{
Log.e("WifiPreference IpAddress", ex.toString());
}
return null;
}
@Override
public String getUser() {
editText = edit.getText().toString();
System.out.println("GetUser():"+editText);
return editText;
}
@Override
public String getPassword() {
// TODO Auto-generated method stub
return null;
}
}
Activity与其他组件使用广播传值也是类似的,就不赘述了。