您的位置:首页 > 其它

实现Activity发送数据给Service ,基于Message和Bundle发送复杂数据

2016-05-27 09:04 411 查看
Activity发送数据给Service 分两种情况

方法1、发送单次数据:

   一般是在启动Service的时候发送数据给Service,只发送一次,此处值给出比较关键的代码

     Activity内部使用intent 携带需要发送的数据,发送并启动Service

  String[] strarray=((String) List.getItemAtPosition(position)).split(": ",2);
   intent = new Intent(SelectBlue.this,BlueService.class);
   intent.putExtra("Addr", strarray[1]);  //向Service传递数据
   intent.setAction("BlueService");
   startService(intent);

  Service的onStartCommand函数 取出数据

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Addr = intent.getStringExtra("Addr");
System.out.println("Addr="+Addr);
return super.onStartCommand(intent, flags, startId);
}

方法2、当在一个Activity内部多次发送数据给Service的时候使用方法1就不合适了,总不能发送一起就启动一次Service吧

 参考:Activity与Service通信(不同进程之间)      关于Message及Bundle数据

红色标注出了关键代码部分

service.java文件:

package com.example.service;

import android.app.Service;

import android.content.Intent;

import android.os.Binder;

import android.os.Bundle;

import android.os.Handler;

import android.os.IBinder;

import android.os.Message;

import android.os.Messenger;

  public class service extends Service{

    private boolean quit=false;
 private int count[] = new int[8];
 private MyBinder binder = new MyBinder();
//定义的一个内部类
public class MyBinder extends Binder{  
public int[] getCount()
{
return count;

}
};

   class MSG2Activity extends Handler{

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
if(msg.what==0X123){
Bundle bundle = msg.getData();
System.out.println("Step=" +bundle.getInt("Step"));
System.out.println("addr=" +bundle.getInt("addr"));
System.out.println("cmd=" +bundle.getInt("cmd"));
System.out.println("state=" +bundle.getInt("state"));
System.out.println("name=" +bundle.getString("name"));

}
System.out.println("OK");

 super.handleMessage(msg);
}
  

   }

   final Messenger mMessenger = new Messenger(new MSG2Activity()); 
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("onBind");
return mMessenger.getBinder();
}

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("onCreate");
new Thread(){

@Override
public void run() {
// TODO Auto-generated method stub
while(!quit){
  try{
  Thread.sleep(1000);
  }catch(InterruptedException e){

  }
  for(int i=0;i<8;i++)
     count[i]++;
 //System.out.println("count++");

}
}
}.start();
super.onCreate();
}

@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("onUnbind");
quit=true;
return super.onUnbind(intent);
}
@Override
public void onRebind(Intent intent) 
{
super.onRebind(intent);
this.quit = true;
System.out.println("Service is ReBinded");
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
System.out.println("onDestroy");
quit=true;
super.onDestroy();
}

}

MainActivity.java文件:

package com.example.service;

import android.os.Bundle;

import android.os.IBinder;

import android.os.Message;

import android.os.Messenger;

import android.os.RemoteException;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.util.Log;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class MainActivity extends Activity {
private Button BtBinder=null;
private Button BtUnBinder=null;
private Button BtnRead=null;
private Button Btnnext=null;
private Button BtnSend=null;
private service.MyBinder binder;
private Messenger mService = null;
private ServiceConnection conn= new ServiceConnection()
{

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
System.out.println("onServiceConnected");
//binder = (service.MyBinder)service;
mService = new Messenger(service);

}

@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
System.out.println("onServiceDisconnected");
}

};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Intent intent = new Intent();
intent.setAction("FirstService");
//bindService(intent, conn, service.BIND_AUTO_CREATE);

BtBinder = (Button)findViewById(R.id.buStart);
BtBinder.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println("START");
bindService(new Intent(MainActivity.this,service.class),conn, Context.BIND_AUTO_CREATE);
// bindService(intent, conn, service.BIND_AUTO_CREATE);
}
});

BtnSend = (Button)findViewById(R.id.SendData);
BtnSend.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//System.out.println("START");
Bundle bundle = new Bundle();
bundle.putInt("Step", 5);
bundle.putInt("addr", 6);
bundle.putInt("cmd", 7);
bundle.putInt("state", 8);
bundle.putString("name", "go home ");

Message msg = Message.obtain(null,0x123,0);
msg.setData(bundle);
try {
mService.send(msg);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});

BtUnBinder = (Button)findViewById(R.id.buStop);
BtUnBinder.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println("STOP");

Log.i("out", "STOP");  
unbindService(conn);
}
});
BtnRead = (Button)findViewById(R.id.buRead);
BtnRead.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println("STOP");

int[] res=new int[8];
res=binder.getCount();
System.out.println("res[0]"+res[0]);

System.out.println("res[1]"+res[1]);
System.out.println("res[2]"+res[2]);

System.out.println("res[3]"+res[3]);

System.out.println("res[4]"+res[4]);

System.out.println("res[5]"+res[5]);
System.out.println("res[6]"+res[6]);

System.out.println("res[7]"+res[7]);
}
});

Btnnext = (Button)findViewById(R.id.next);
Btnnext.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

              Intent intent=new Intent(MainActivity.this,secActivity.class);

              startActivity(intent);
}
});
}

private ServiceConnection Intent(MainActivity mainActivity,
Class<service> class1) {
// TODO Auto-generated method stub
return null;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: