Android广播传值

本文介绍了Android广播的使用,包括发送者和服务间的通信。通过sendBroadcast(intent)发送广播,BroadcastReceiver作为接收器。广播主要应用于app内部组件间,多进程组件间,不同app间以及系统与App的消息传递。举例说明了Service如何向Activity发送广播。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
	} 
}


接收广播的Activity:SocketServerDemo.java

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与其他组件使用广播传值也是类似的,就不赘述了。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值