实例:
public class MainActivity extends Activity { private TextView loadingTv; private ProgressBar mBar; private Intent intent; private SharedPreferences pref; Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { int current = pref.getInt("current", -1); if (current>100||current<0) { Log.i("tag", "进度值错误"); }else { mBar.setProgress(current); loadingTv.setText(current+"%"); handler.sendEmptyMessageDelayed(1, 1000); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loadingTv = (TextView)findViewById(R.id.loadingTv); mBar = (ProgressBar)findViewById(R.id.bar); intent = new Intent(this,ShareFileService.class); pref = getSharedPreferences("currentLoading", MODE_PRIVATE); mBar.setMax(100); } public void start(View view){ startService(intent); handler.sendEmptyMessageDelayed(1, 1000); } public void stop(View view){ stopService(intent); } } public class ShareFileService extends Service{ private Timer timer; private SharedPreferences preferences; private int i = 0; @Override public void onCreate() { super.onCreate(); timer = new Timer(); //定时器 preferences = getSharedPreferences("currentLoading", MODE_PRIVATE); timer.schedule(new MyTimerTask(), 0,1000); } public void setCurrentLoading(int value){ preferences.edit().putInt("current", value).commit(); } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { super.onDestroy(); if (timer!=null) { timer.cancel(); timer = null; } } class MyTimerTask extends TimerTask{ @Override public void run() { setCurrentLoading(i); if (i==100) { i=0; } i++; } } } (注册服务) 3.自定义接口: 实现过程: 自定义接口,在接口当中写入获取数据的方法,在service当中写一个内部类继承与Binder类同时实现这个接口, 并且重写获取数据的方法,在方法中返回数据,然后在onBind方法中返回自定义类的对象, 在activity当中绑定服务,写一个类继承于ServiceConnection,通过onServiceConnected方法得到接口自定义的 子类的对象,然后调用他的方法,就可以得到service端返回的数据了。 小结: 这种写法简单,拓展性强,但是也存在缺点,延迟获取服务器端的消息,无法从0开始同步信息,自定义接口方式完成通信只能用于进程间通信,不能用于跨进程通信。
实例:
public class MainActivity extends Activity { private TextView loadTV; private ProgressBar bar; private MyService.MyBind bind; private Loading load; Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { if (msg.what == 1) { int i = load.getloading(); bar.setProgress(i); loadTV.setText(i + "%"); handler.sendEmptyMessageDelayed(1, 100); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loadTV = (TextView) findViewById(R.id.loadingTv); bar = (ProgressBar) findViewById(R.id.bar); bar.setMax(100); } ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { load = (Loading) service; } }; public void start(View view) { Intent intent = new Intent(this, MyService.class); boolean b = bindService(intent, conn, BIND_AUTO_CREATE); if (b) { Toast.makeText(this, "绑定成功", Toast.LENGTH_SHORT).show(); handler.sendEmptyMessageDelayed(1, 100); } else { Toast.makeText(this, "绑定失败", Toast.LENGTH_SHORT).show(); } } public void stop(View view) { unbindService(conn); } } public class MyService extends Service { private int i = 0; private Timer timer; private MyTimeTask myTimeTask; @Override public void onCreate() { super.onCreate(); timer = new Timer(); myTimeTask = new MyTimeTask(); timer.scheduleAtFixedRate(myTimeTask, 0, 100); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return new MyBind(); } class MyBind extends Binder implements Loading { public MyService getservice() { return MyService.this; } @Override public int getloading() { // TODO Auto-generated method stub return i; } } @Override public void onDestroy() { super.onDestroy(); if (timer != null) { timer.cancel(); timer = null; } } public class MyTimeTask extends TimerTask { @Override public void run() { // TODO Auto-generated method stub if (i < 100) { i++; } else { i = 100; } } } } (注册服务) public interface Loading { int getloading(); }