service
1、service是Android四大组件之一
2、service本质上是后台运行的可执行程序,它没有Activity那样的用户界面。
3、service通常不与用户交互,不能自己启动,运行在后台。
4、service主要用于长时间的后台服务,以及周期性的后台监控。
一、播放媒体时,启动其他Activity,此时程序要在后台继续播放。
二、检测sd卡上的文件变化。
三、后台记录手机当前地理信息位置的改变
四、后台完成大文件下载
5、service具有更高的进程优先级,五个级别中,位于第三个级别。
6、service具有全局唯一性。同一时间系统只能存在service一个实例。
7、service必须在项目清单中注册才能使用。
8、service分为系统服务和应用服务。
一:系统服务,Android提供大量的系统service,如媒体播放服务。
二:应用服务,开发者自定义服务。
下面介绍下service生命周期:
创建一个service很简单,我们在页面上建两个按钮:
当点击启动按钮时,启动一个service,此时控制台显示oncreate();当再次点击启动按钮时,此时控制台显示onstartcommand();当点击停止按钮时,此时控制台显示ondestroy();再点停止就没反应了。再点启动就是oncreate();
界面和简单就不写了。
MainActivity:
package com.example.servicedemo; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setListener(); } private void setListener() { startServiceListener(); stopServiceListener(); } private void stopServiceListener() { findViewById(R.id.btnstop).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(MainActivity.this,MyService.class); stopService(intent); } }); } private void startServiceListener() { findViewById(R.id.btn).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(MainActivity.this,MyService.class); startService(intent); } }); } }
MyService:
1 package com.example.servicedemo; 2 3 import android.app.Service; 4 import android.content.Intent; 5 import android.os.IBinder; 6 import android.util.Log; 7 8 public class MyService extends Service{ 9 10 @Override 11 public IBinder onBind(Intent arg0) { 12 13 return null; 14 } 15 16 @Override 17 public void onCreate() { 18 // TODO Auto-generated method stub 19 super.onCreate(); 20 Log.i("main", "onCreate()"); 21 } 22 23 @Override 24 public int onStartCommand(Intent intent, int flags, int startId) { 25 // TODO Auto-generated method stub 26 Log.i("main", "onStartCommand()"); 27 return super.onStartCommand(intent, flags, startId); 28 } 29 30 @Override 31 public void onDestroy() { 32 // TODO Auto-generated method stub 33 super.onDestroy(); 34 Log.i("main","onDestroy()"); 35 } 36 }
同时,要在清单中注册service:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.servicedemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.servicedemo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.example.servicedemo.MyService"></service> </application> </manifest>
上面这个是没有绑定service。下面介绍下绑定service并与之通信。
当启动service时,是绑定和启动一起,那么在解绑的过程中,也是解绑和停止一起。当启动service是,只是启动,没有绑定,那么在绑定之后再解绑,就只是解绑,没有停止service。
mainactivity:
package com.example.servicedemo; import com.example.servicedemo.MyService.MyBinder; import android.os.Bundle; import android.os.IBinder; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; public class MainActivity extends Activity { MyBinder mBinder; private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName arg0) { Log.i("main", "解绑service"); } @Override public void onServiceConnected(ComponentName arg0, IBinder service) { mBinder = (MyBinder)service; Log.i("main", "绑定service" +"count="+mBinder.getCount()); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setListener(); } private void setListener() { startServiceListener(); stopServiceListener(); bindServcieListener(); unbindServiceListener(); } private void unbindServiceListener() { findViewById(R.id.btnunbind).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { unbindService(conn); } }); } //绑定service private void bindServcieListener() { findViewById(R.id.btnbind).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent service = new Intent(MainActivity.this,MyService.class); //service:将访问者mainactivity与服务绑定,指定要启动的service //conn:监听访问者和service之间的连接情况。有数据传递。 //flag:是否自动创建service。 bindService(service , conn, Context.BIND_AUTO_CREATE); } }); } //停止service private void stopServiceListener() { findViewById(R.id.btnstop).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(MainActivity.this,MyService.class); stopService(intent); } }); } //启动service private void startServiceListener() { findViewById(R.id.btn).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(MainActivity.this,MyService.class); startService(intent); } }); } }
myservice:
1 package com.example.servicedemo; 2 3 import android.app.Service; 4 import android.content.Intent; 5 import android.os.Binder; 6 import android.os.IBinder; 7 import android.util.Log; 8 9 public class MyService extends Service{ 10 int count = 10; 11 @Override 12 public IBinder onBind(Intent arg0) { 13 MyBinder myBinder = new MyBinder(); 14 return myBinder; 15 } 16 17 class MyBinder extends Binder{ 18 public int getCount(){ 19 return ++count; 20 } 21 } 22 23 @Override 24 public void onCreate() { 25 // TODO Auto-generated method stub 26 super.onCreate(); 27 Log.i("main", "onCreate()"); 28 } 29 30 @Override 31 public int onStartCommand(Intent intent, int flags, int startId) { 32 // TODO Auto-generated method stub 33 Log.i("main", "onStartCommand()"); 34 return super.onStartCommand(intent, flags, startId); 35 } 36 37 @Override 38 public void onDestroy() { 39 // TODO Auto-generated method stub 40 super.onDestroy(); 41 Log.i("main","onDestroy()"); 42 } 43 @Override 44 public boolean onUnbind(Intent intent) { 45 // TODO Auto-generated method stub 46 Log.i("main","onUnbind()"); 47 // return super.onUnbind(intent); 48 return true;//解除绑定后再绑定,这里要返回true。 49 } 50 @Override 51 public void onRebind(Intent intent) { 52 Log.i("main","onRebind()"); 53 // TODO Auto-generated method stub 54 super.onRebind(intent); 55 } 56 }