登山则情满于山,观海则意溢于海。这篇文章主要讲述Android之 服务相关的知识,希望能为你提供帮助。
1 简介
服务是android四大组件之一。不过与Activity不同的是,服务不会直接与用户交互,而是摸摸地在后台运行。
有两种方式来启动系统服务。
一种是调用 Context.startService()
方法。
另一种是调用 Context.bindService() 方法。
2 服务的生命周期
下面这张图说明了服务的生命周期。当用户调用Context.startService()或者Context.binService()时,系统会启动服务。
如果服务没有创建,那么系统首先会调用Service类中的onCreate()方法,然后onStart()方法或者onBind()方法将会执行,开启一个服务。
服务会一直默默地在后台进行,调用Context.stopService()或stopSelf()方法,服务中的onDestroy()会执行,销毁服务。
当通过Context.bindService()开启服务后,必须通过Context.unbindService()停止服务。
文章图片
3 实例
3.1 通过Context.startService()启动服务
【Android之 服务】首先新建一个类,继承Service类。
public class MyService extends Service{@Override public IBinder onBind(Intent intent){ return null; }@Override public void onCreate(){ super.onCreate(); Log.d("MyService","onCreate executed!"); }@Override public void onStart(Intent intent, int startId){ super.onStart(); Log.d("MyService","onStart executed!"); }@Override public void onDestroy(){ super.onDestroy(); Log.d("MyService","onDestroy executed!"); }}
然后在活动中通过点击按钮,实现活动的启动或停止。
3.1 通过Context.bindService()启动服务
上面的方式,我们只能通过活动界面的按钮来启动和停止服务。如果服务想要跟活动更多的交流,就需要采用另外一种方式来开启活动。
1、通过Context.bindService()启动服务,我们同样需要继承Service类,重写onBind()方法。
在onBind()方法中我们返回一个Binder对象。Binder类的API定义如下:
文章图片
下面是具体代码:
public class MyService extends Service { private DownloadBinder mBinder = new DownloadBinder(); DownloadBinder extends Binder { public void startDownload() { Log.d("MyService", "startDownload executed"); } public int getProgress() { Log.d("MyService", "getProgress executed"); return 0; } }@Override public IBinder onBind(Intent intent) { return mBinder; } …… }
可以看到我们定义了一个内部类DownloadBinder继承自Binder,在这个类中我们实现了两个方法,用于启动下载和获取进度。
2、接下来就是在活动中通过Context.bindService()启动服务,并且用上面的DownloadBinder中定义的方法,与服务随时交互。
下面是具体代码
public class MainActivity extends Activity implements OnClickListener {private Button bindService; private Button unbindService; private MyService.DownloadBinder downloadBinder; private ServiceConnection connection = new ServiceConnection() {@Override public void onServiceDisconnected(ComponentName name) { }@Override public void onServiceConnected(ComponentName name, IBinder service) { downloadBinder = (MyService.DownloadBinder) service; downloadBinder.startDownload(); downloadBinder.getProgress(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); …… bindService = (Button) findViewById(R.id.bind_service); unbindService = (Button) findViewById(R.id.unbind_service); bindService.setOnClickListener(this); unbindService.setOnClickListener(this); }@Override public void onClick(View v) { switch (v.getId()) { case R.id.bind_service: Intent bindIntent = new Intent(this, MyService.class); bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务 break; case R.id.unbind_service: unbindService(connection); // 解绑服务 break; default: break; } } }
推荐阅读
- Android APK用途及使用小结(待续)
- Android -- 自定义ScrollView实现放大回弹效果
- android屏蔽BACK键HOME键和多任务键
- Chromimum Android渲染介绍
- Android类加载之PathClassLoader和DexClassLoader
- Android 使用Java8新特性之"方法引用"
- android控件基本布局
- react-native修改android包名
- AndroidTV中实现飞框选中效果