玩过安卓的朋友都知道,安卓的显著特点:应用程序可以在后台运行,这样的效果就是用到android 的四大组件之一Service服务。
就我刚学Service写点学习经验吧。首先Service不是一个独立的进程,也不是一个独立的线程,它是和应用程序绑定在一起的。可能对于多线程掌握的不好,我也不是很理解。写一个简单的服务来记录Service吧。
首先是界面类,MyService.java
public class MyService extends Activity {
Intent intent ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.service);
Button start = (Button) findViewById(R.id.startService);
start.setOnClickListener(new OnClickListener() {
// 匿名内部类的作用域在内部类中,不能直接用this来表示当前的activity
@Override
public void onClick(View v) {
intent = new Intent(MyService.this, Services.class);
MyService.this.startService(intent);
}
});
Button stop = (Button) findViewById(R.id.stopService);
stop.setOnClickListener(new OnClickListener() {
// 匿名内部类的作用域在内部类中,不能直接用this来表示当前的activity
@Override
public void onClick(View v) {
if (intent != null) {
boolean b = MyService.this.stopService(intent);// 这里返回一个boolean值
Log.i("stop", "stop Service !"+b);
}
}
});
}
}
然后是服务类,Services.java
public class Services extends Service {
private static final String TAG = "service->";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 用一个线程将服务包容一起来,防止I/O阻塞,这里也涉及到一个匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 30; i++) {
try {
Thread.sleep(1000);
Log.i(TAG, "start service" + i);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onDestroy() {
Log.i("service", "service id destroy");
super.onDestroy();
}
}
这里也只是一个小例子,帮助刚学Service的朋友理解下,这里用logcat打印出来有助于对Service后台服务的理解