上面講的内容都是從Activity裡傳資料給Service,那麼到底怎麼樣才能把Service的資料傳給Activity呢?這裡有一種方法:
Service實時向Activity傳遞資料案例
package com.ljq.activity;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class CountService extends Service {
private int count = ;
private boolean threadDisable=false;
@Override
public void onCreate() {
super.onCreate();
new Thread(new Runnable() {
@Override
public void run() {
while (!threadDisable) {
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
Log.v("CountService", "Count is " + count);
//發送廣播
Intent intent=new Intent();//這裡又跟Activity對應起來了。
intent.putExtra("count", count);
intent.setAction("com.ljq.activity.CountService");
sendBroadcast(intent);
}
}
}).start();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
count=;
threadDisable = true;
Log.v("CountService", "on destroy");
}
}
然後在MainActivity裡面寫上
public class MainActivity extends Activity {
private EditText editText=null;
private MyReceiver receiver=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editText=(EditText)findViewById(R.id.editText);
//啟動服務
startService(new Intent(MainActivity.this, CountService.class));
//注冊廣播接收器
receiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("com.ljq.activity.CountService");
MainActivity.this.registerReceiver(receiver,filter);
}
@Override
protected void onDestroy() {
//結束服務
stopService(new Intent(MainActivity.this, CountService.class));
super.onDestroy();
}
/**
* 擷取廣播資料
*
* @author jiqinlin
*
*/
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle=intent.getExtras();
int count=bundle.getInt("count");
editText.setText(count+"");
}
}
}
這裡是複制的其他人的,看起來是個簡潔的方法,但是我還沒有學到廣播呢
下面是我在學習過程中的代碼
public class MyService extends Service {
String data;
private boolean running=false;
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
return new Binder();
}
public class Binder extends android.os.Binder{
public void setData(String data){
MyService.this.data=data;
}
public MyService getService(){
return MyService.this;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
data=intent.getStringExtra("data");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
super.onCreate();
running=true;
new Thread(){
@Override
public void run() {
super.run();
int i=;
while (running){
try {
sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
String str=i+":"+data;
System.out.println(str);
if (callback!=null){
callback.onDataChange(str);
}
}
}
}.start();
}
@Override
public void onDestroy() {
super.onDestroy();
running=false;
}
private Callback callback=null;
public void setCallback(Callback callback) {
this.callback = callback;
}
public Callback getCallback() {
return callback;
}
public interface Callback{
void onDataChange(String str);
}
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {
private EditText edit;
private EditText edit2;
private MyService.Binder binder;
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText)findViewById(R.id.edit) ;
findViewById(R.id.startService).setOnClickListener(this);
findViewById(R.id.stopService).setOnClickListener(this);
findViewById(R.id.BindService).setOnClickListener(this);
findViewById(R.id.unBindService).setOnClickListener(this);
findViewById(R.id.syscdata).setOnClickListener(this);
edit2=(EditText)findViewById(R.id.edit2);
text=(TextView) findViewById(R.id.textview);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.startService:
Intent intent=new Intent(this,MyService.class);
intent.putExtra("data",edit.getText().toString());
startService(intent);
break;
case R.id.stopService:
stopService(new Intent(this,MyService.class));
break;
case R.id.BindService:
bindService(new Intent(this,MyService.class),this, Context.BIND_AUTO_CREATE);
break;
case R.id.unBindService:
unbindService(this);
break;
case R.id.syscdata:
if (binder!=null){
binder.setData(edit2.getText().toString());
}
break;
}
}
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
binder= (MyService.Binder) iBinder;
binder.getService().setCallback(new MyService.Callback() {
@Override
public void onDataChange(String str) {
Message msg=new Message();
Bundle b=new Bundle();
b.putString("data",str);
msg.setData(b);
handler.sendMessage(msg);
}
});
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
text.setText(msg.getData().getString("data"));
}
};
}
這一次為什麼這麼懶呢,直接把代碼貼過來,是因為我也不太了解,這一部分隻能照着敲一下代碼,再慢慢琢磨吧。