Service
是 Android 四大基本组件之一,是无界面的应用程序,可以长期在后台运行,在实际工作中非常重要,比如接收推送消息、在锁屏状态下侦听传感器信息。
1. 使用Service
新建工程 LearnService ,然后在源代码里边新建一个 Service(右键->New->Service),更改activity_main.xml:
activity_main.xml
修改布局: LinearLayout
布局走向: android:orientation="vertical"
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动服务"
android:id="@+id/btnStarService" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止服务"
android:id="@+id/btnStopService" />
在 MainActivity.java 添加两个事件监听器分别来启动服务和停止服务:
findViewById(R.id.btnStarService).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startService(new Intent(MainActivity.this, MyService.class));
}
});
findViewById(R.id.btnStopService).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(new Intent(MainActivity.this, MyService.class));
}
});
运行后先去手机设置->开发者选项->正在运行的服务,发现没有。接着点击 starService,发现出现LearnService,点击 stopService 随即消失。
接着让它不断地在后台输出一段语句:
在 MyService.java 里面重写一个 onStarCommand,这个函数会在外界执行了 startService 的时候被执行。然后在里边创建一个线程来不断地运行输出语句:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(){
@Override
public void run() {
super.run();
while(true) {
System.out.println("服务正在运行...");
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
return super.onStartCommand(intent, flags, startId);
}
运行点击启动服务,可以看到控制台每隔一秒的输出。
2. 绑定Service
在 activity_main.xml 新添两个Button:
<Button
android:text="绑定服务"
android:id="@+id/btnBindService" />
<Button
android:text="解除绑定服务"
android:id="@+id/btnUnBindService" />
然后在 MainActivity.java 中添加两个监听器,但如果说,我们有多个按钮都要执行这个函数的话,我们可以把它们都写在一起:
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(MainActivity.this, MyService.class);
findViewById(R.id.btnStarService).setOnClickListener(this);
findViewById(R.id.btnStopService).setOnClickListener(this);
findViewById(R.id.btnBindService).setOnClickListener(this);
findViewById(R.id.btnUnBindService).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btnStarService:
startService(intent);
break;
case R.id.btnStopService:
stopService(intent);
break;
case R.id.btnBindService:
bindService(intent, this, Context.BIND_AUTO_CREATE);
break;
case R.id.btnUnBindService:
unbindService(this);
break;
}
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("Service Connected");
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
运行点击绑定出现错误,修改 MyService.java :
@Override
public IBinder onBind(Intent intent) {
return new Binder();
}
3. Service的生命周期
...