本地服务的交互
1.通过发送广播的方式进行消息传递
实现原理:
server端当有内容需要传递时,可以发送一条广播,而client端可以注册一个广播接收者去接收广播信息,
根据内容做相关的操作。
小结:
通过广播的方式来实现activity和service的交互是非常简单而且容易实现的,一般可以胜任轻量级的应用。
它的缺点也比较明显,发送的广播会受到系统的制约,系统会优先发送系统广播,在某些特定的情况之下,
自定义广播的发送会有延迟,就不能即使的收到信息了,而且在广播接受者中不能做耗时操作,会造成ANR异常。
2.文件的共享
实现原理:
server可以把传递的信息写入到文件中,然后client端在读取文件信息,显示在界面上。
小结:
通过文件共享的方式达成了activity和service的通信,整体来说也比较简单,相当于一个往里写,一个往外读,
形成了一个通道,但是也是有缺点,当数据量过多时或者说数据结构过于复杂,那么写入和读取就会造成不一致的
效果,就会造成错误,而且经过了中转站,也比较消耗时间。
实例:
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();
}