Service:没有可视化的UI,能长时间的运行在后台,创建的Service不能自动运行,需要其他组件来指定启动它,开发一个Service需要在AndroidManifest.xml中注册,注册代码为:
Service的生命周期如下图:
有两种方式可以启动Service,分别是 startService() 和bindService(),
示例代码如下:设置四个按钮,用于用于startService、stopService、bindService和unbindService。通过观察LogCat的输出,可以了解Service的生命周期!
1.strings.xml中代码:
-
<?xml version=\"1.0\" encoding=\"utf-8\"?>
-
<resources>
-
<string name=\"app_name\">MyServiceDemo</string>
-
<string name=\"servicetest\">Service Test</string>
-
<string name=\"startservice\">Service start</string>
-
<string name=\"stopservice\">Service stop</string>
-
<string name=\"bindservice\">Service bind</string>
-
<string name=\"unbindservice\">Service unbind</string>
-
</resources>
2.layout中的activity_main.xml代码:
-
<LinearLayout xmlns:android=\"\"
-
xmlns:tools=\"\"
-
android:layout_width=\"match_parent\"
-
android:layout_height=\"match_parent\"
-
android:orientation=\"vertical\"
-
>
-
<TextView
-
android:layout_width=\"wrap_content\"
-
android:layout_height=\"wrap_content\"
-
android:text=\"@string/servicetest\"
-
/>
-
<Button
-
android:layout_width=\"wrap_content\"
-
android:layout_height=\"wrap_content\"
-
android:text=\"@string/startservice\"
-
android:id=\"@+id/startservice\"
-
/>
-
<Button
-
android:layout_width=\"wrap_content\"
-
android:layout_height=\"wrap_content\"
-
android:text=\"@string/stopservice\"
-
android:id=\"@+id/stopservice\"
-
/>
-
<Button
-
android:layout_width=\"wrap_content\"
-
android:layout_height=\"wrap_content\"
-
android:text=\"@string/bindservice\"
-
android:id=\"@+id/bindservice\"
-
/>
-
<Button
-
android:layout_width=\"wrap_content\"
-
android:layout_height=\"wrap_content\"
-
android:text=\"@string/unbindservice\"
-
android:id=\"@+id/unbindservice\"
-
/>
-
</LinearLayout>
3.接下来是MainActivity.java的代码:
4.MyService继承于Service,代码如下:
-
package com.example.myservicedemo;
-
-
import android.app.Service;
-
import android.content.Intent;
-
import android.os.Binder;
-
import android.os.IBinder;
-
-
public class MyService extends Service {
-
-
/**
-
* 代码关键之处,在于 onBind(Intent) 这个方法 返回了一个实现了 IBinder 接口的对象,
-
* 这个对象将用于绑定Service 的 MainActivity 与 MyService 通信。
-
*/
-
private IBinder binder=new MyBinder();
-
@Override
-
public IBinder onBind(Intent intent) {
-
-
System.out.println("onBind operation");
-
return binder;
-
}
-
-
@Override
-
public boolean onUnbind(Intent intent)
-
{
-
System.out.println("onUnBind operation");
-
return super.onUnbind(intent);
-
}
-
-
@Override
-
public void onCreate()
-
{
-
System.out.println("onCreate operation");
-
super.onCreate();
-
}
-
-
@Override
-
public int onStartCommand(Intent intent,int flags,int startId)
-
{
-
System.out.println("onStartCommand operation");
-
return super.onStartCommand(intent, flags, startId);
-
-
}
-
-
@Override
-
public void onStart(Intent intent,int startId)
-
{
-
System.out.println("onStart operation");
-
super.onStart(intent, startId);
-
}
-
-
@Override
-
public void onDestroy()
-
{
-
System.out.println("onDestroy operation");
-
-
super.onDestroy();
-
-
}
-
-
//返回MyService对象
-
public class MyBinder extends Binder{
-
public MyService getService()
-
{
-
return MyService.this;
-
}
-
}
-
}
5.模拟器界面:
6.程序运行结果如下:
A.点击Service start按钮后:
B.再次点击Service start按钮后:
发现再次点击Service start按钮后,不再执行onCreate(),
C:点击Service stop按钮后:
D:点击Service bind按钮后:
可以看到调用onBind()方法后,MainActivity自动调用 ServiceConnection接口中的onServiceConnected()方法,告诉主线程,服务已经连接上了!
E:多次点击Service bind按钮后:
发现多次绑定Service,只有第一次有效。对于绑定服务,只有一次绑定和一次解除绑定有效,多次绑定和多次解除绑定是无效的!
F:点击Service unbind按钮后:
小结:发现unbindService之后(),程序并没有调用ServcieConnection接口里面 的onServiceDisconnected()方法,
LogCat没有输出 Server is disconnected,那这个服务还是存在的吧?
ServiceConnection接口里的onServiceDisconnected()方法只会在Service被停止或者被系统杀死以后调用。
阅读(3018) | 评论(0) | 转发(0) |