安卓服务(Service)的两种开启方式以及服务的生命周期
2016-04-05 19:02
141 查看
安卓中服务的开启方式
一:採用start的方式开启服务调用函数:startService(Intent)->onCreate()->onStart()/onStartCommand()->onDestroy()
特点:服务被开启后不会反复开启,仅仅会调用onStart(),服务仅仅会被停止一次。
二:採用bind的方式开发服务
调用函数:bindService(Intent…)->onCreate()->onBind()->onUnBind()->onDestroy();
特点:绑定不会调用onStart()[过时了]和onStartCommand()方法。
两种服务的差别:
start方式开发服务,一旦服务开启跟调用者就没有不论什么关系了。比方我们的服务是在Activity中调用开启的,当Activity关闭的时候,服务不会关闭。
bind方式开启服务,调用者没了。服务也会关闭,能够理解为同生共死。
对于start开启服务的方式比較简单。重点解说bind的方式。
样例:
1.布局里面设置三个button
2.为button设置监听事件。有好几种方式。
3.处理事件。
当点击绑定的时候:
/*绑定的创建方式 */ Intent intent = new Intent(this, MyService.class); bindService(intent, conn, BIND_AUTO_CREATE);
conn是自己实现的功能类,继承自ServiceConnection。
完整代码例如以下:
public class MainActivity extends ActionBarActivity { private MyConn conn; private Call c; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//Call相似中间人的功能。 } public void bind(View v){ conn = new MyConn(); Intent intent = new Intent(this, MyService.class); bindService(intent, conn, BIND_AUTO_CREATE); } public void unbind(View v){ unbindService(conn); c = null; } /* * 调用服务里的方法 */ public void call(View v){ c.callMethodInService(); } private class MyConn implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { System.out.println("调用服务里面的方法"); c = (Call) service; } @Override public void onServiceDisconnected(ComponentName name) { } } }
service代码例如以下:
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { System.out.println("服务被成功绑定了"); return new Call(); } @Override public void onCreate() { System.out.println("onCreate"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("onstartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { System.out.println("ondestroy"); super.onDestroy(); } public void methodInService(){ Toast.makeText(this, "methodInService", 0).show(); } public class Call extends Binder{ public void callMethodInService(){ methodInService(); } } }
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.servicelife.MainActivity" > <Button android:onClick="bind" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="start"/> <Button android:onClick="unbind" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="end"/> <Button android:onClick="call" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="调用服务里的方法"/> </LinearLayout>
点击下载源码
相关文章推荐
- centos 安装 mongdb
- PHP Closure类详解
- Windows8上面安装Oracle11g时,安装程序报错:[INS-13001]环境不满足最低要求
- 303-e-Range Sum Query - Immutable
- Android 打造万能的ViewPagerIndicator 指示器
- 程序员必备注释
- 数组中求第K大数
- Cacti(php脚本)
- VS2015解决问题 Could not load file or assembly 'Microsoft.VisualStudio.ConnectedServices, Version=2.0.0.
- cf 2016愚人节专场 函数指针 最短路
- win10 uwp App-to-app communication 应用通信
- 穷举法解决组合问题(换分币)
- openjudge 4077出栈序列统计
- UVa 507 - Jill Rides Again
- UVa 624 - CD
- UVa 562 - Dividing coins
- 用JAVA写的一个简单的图形界面计算器
- UVa 10440 - Ferry Loading II
- UVA 10954 - Add All
- UVa 10020 - Minimal coverage