今天学习到Service,在用Service下载文件时,一个问题就是Service没有界面,如何通知用户当前下载的进度,Service直接向Activity传数据有点麻烦,于是想到了用Broadcast,Service广播,Activity负责接收,再对接收到的数据进行处理,就达到了我们的目的。下面是今天这个程序的运行效果:
先注册Receiver,然后开始Service,上面的TextView和ProgressBar就会随着Service传过来的值变,解除注册Receiver或者结束Service后不会再变。
Service代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package com.services; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; public class TestService extends Service { boolean isStop=false; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.i("TAG","绑定"); return null; } public void onCreate(){ Log.i("TAG","Services onCreate"); super.onCreate(); } public void onStart(Intent intent,int startId){ Log.i("TAG","Services onStart"); super.onStart(intent, startId); new Thread(){//新建线程,每隔1秒发送一次广播,同时把i放进intent传出 public void run(){ int i=0; while(!isStop){ Intent intent=new Intent(); intent.putExtra("i", i); i++; intent.setAction("android.intent.action.test");//action与接收器相同 sendBroadcast(intent); Log.i("TAG",String.valueOf(i)); try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }.start(); } @Override public void onDestroy() { Log.i("TAG","Services onDestory"); isStop=true;//即使service销毁线程也不会停止,所以这里通过设置isStop来停止线程 super.onDestroy(); } } |
Activity代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | package com.services; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; public class main extends Activity { /** Called when the activity is first created. */ Button b1,b2,b3,b4; TestService mService; ProgressBar pb; MyReceiver receiver; TextView tv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); b1=(Button)findViewById(R.id.b1); b2=(Button)findViewById(R.id.b2); b3=(Button)findViewById(R.id.b3); b4=(Button)findViewById(R.id.b4); b1.setOnClickListener(l1); b2.setOnClickListener(l2); b3.setOnClickListener(l3); b4.setOnClickListener(l4); pb=(ProgressBar)findViewById(R.id.pb); tv=(TextView)findViewById(R.id.tv); } public class MyReceiver extends BroadcastReceiver { //自定义一个广播接收器 @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub System.out.println("OnReceiver"); Bundle bundle=intent.getExtras(); int a=bundle.getInt("i"); pb.setProgress(a); tv.setText(String.valueOf(a)); //处理接收到的内容 } public MyReceiver(){ System.out.println("MyReceiver"); //构造函数,做一些初始化工作,本例中无任何作用 } } OnClickListener l1=new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub startService(new Intent(main.this, TestService.class)); //开始服务 } }; OnClickListener l2=new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub stopService(new Intent(main.this, TestService.class)); //结束服务 } }; OnClickListener l3=new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub //注册接收器 receiver=new MyReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction("android.intent.action.test"); main.this.registerReceiver(receiver,filter); } }; OnClickListener l4=new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub main.this.unregisterReceiver(receiver); //解除注册接收器 } }; } |