Android Service通信








<span style="font-size:18px;">package com.example.androidservice;
import java.util.Random;
import com.example.androidservice.Myservice.Mybinder;
import com.example.androidservice.Myservice.callback;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity  {
	protected static final String TAG = null;
	Button start, bind, stop, unbind,fasong;
	boolean iscon=false;
	Myservice.Mybinder mybinder;
	EditText edit;
	TextView textv;
	ServiceConnection con;
	private Button updata;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		start = (Button) this.findViewById(R.id.id_start);
		bind = (Button) this.findViewById(R.id.id_bangding);
		stop = (Button) this.findViewById(R.id.id_communication);
		unbind = (Button) this.findViewById(R.id.id_unbinder);
		edit=(EditText) this.findViewById(R.id.id_edit);
		textv=(TextView)this.findViewById(R.id.id_xianshi);
		fasong=(Button)this.findViewById(R.id.id_fasong);
		updata=(Button)this.findViewById(R.id.id_updata);
		con=new MyServiceConnection();
		
		
		initevent();
	}

	private void initevent() {
//************************开始服务********************************************
		start.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent =new Intent(MainActivity.this,Myservice.class);
				intent.putExtra("code","海贼王");
				startService(intent);
	        }
		});
//*************************绑定服务*******************************************
		bind.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Log.i(TAG, "点击了");
				if(iscon) return;
				Intent intent =new Intent(MainActivity.this,Myservice.class);
				bindService(intent, con, BIND_AUTO_CREATE);
			}
		});
//***********************解除绑定*********************************************
		unbind.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				 //如果iscon true 说明正在与服务连接中  可以解除服务 
				if(iscon){
				Intent intent =new Intent(MainActivity.this,Myservice.class);
				 unbindService(con);}
			}
		});
//*************************发送消息*******************************************
		fasong.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
		
	 if(!TextUtils.isEmpty(edit.getText().toString().trim())&&mybinder!=null){
		 
					 mybinder.onChange(edit.getText().toString().trim());
					
					 }
				
			}
		});
		//停止服务
		stop.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				if(iscon) {
				Intent intent =new Intent(MainActivity.this,Myservice.class);
				//停止服务
			    stopService(intent);
			 }
				
			}
		});
		//设置回调接口    绑定服务后 更新过来的数据
		updata.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
			  if(mybinder!=null){
				  //设置回调接口
			   mybinder.getMyService().setCallBack(new callback() {
				
				@Override
				public void onUpdata(final String str) {

					runOnUiThread( new Runnable() {
						public void run() {
							textv.setText(str);
						}
					});
					
				}
			});}
			}
		});
	}
	//  connectivitymannager的回调方法  传回IBinder对象
    private class MyServiceConnection implements ServiceConnection{

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
		 mybinder=(Mybinder)service; 
		 
				iscon=true; 
			
		}
    
		@Override
		public void onServiceDisconnected(ComponentName name) {
			
			iscon=false;
		}
    	
    	
    	
    }

}
</span>

service类:

<span style="font-size:18px;">package com.example.androidservice;

import java.util.Random;

import android.R.bool;
import android.app.IntentService;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class Myservice extends Service {
  private static final String TAG = "Myservice";
  private String data;
  String defaultData="默认数据";
  callback call;
  boolean isStart;
  Thread mThread;
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		System.out.print("service绑定");
	
		Mybinder binder=new Mybinder();
		
		return binder;//返回一个Binder
	}
	public class  Mybinder extends Binder{
		public void onChange(String str){
			
                change(str);			
		} 
		public Myservice getMyService(){
			
			return Myservice.this;
		}
		
	} 
	public void setCallBack(callback call){
		this.call=call;
		
		
	}
	public callback getCallBack(){
		
		return this.call;
	}
	
    private void change(String str){
    	
    	defaultData=str;
    }
	@Override
	public void onCreate() {
		System.out.print("service 创建");
	
	   super.onCreate();
	   mThread=new Thread(new Runnable() {
			
			@Override
			public void run() {
				 isStart=true;
				 //开启循环 更新消息
				while (isStart) {
			     //activity发送数据 开启随机数字回调
				String str=defaultData+""+getRandom();
				
				if(call!=null){
					
						call.onUpdata(str);
				
					}
				  try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
					
				}
				
			 
				
			}
		});
	   mThread.start();
		
	}
	
	 

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		System.out.print("service 开始");
		String str=intent.getStringExtra("code");
		System.out.print(str);
		
	
//		START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
//
//		START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
//
//		START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
//
//
//		START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
	
		return super.onStartCommand(intent, flags, startId);
	}
	 
	
	
	
	 
 /**
   * 
 * @author Administrator
 *
 */
public static interface callback{
	     void onUpdata(String str);
    	 
    	 
     }
	
	
	public int getRandom(){
		Random random=new Random();
		return random.nextInt(1000);
		
		
	}
    @Override
	public boolean onUnbind(Intent intent) {
		Log.i(TAG, "onUnbind");
		return super.onUnbind(intent);
	}
	@Override
		public void onDestroy() {
		   isStart=false;
		   Log.i(TAG, "service 已经停止");
			super.onDestroy();
		
		}

}
</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值