启动服务方式1 -- startService(Intent intent)
//结果日志猫里打印
UI界面图示例:
//界面就2个按钮布局不写了
1、在配置清单里配置注册服务
代码
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mystartservice" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".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=".MyService"></service> </application> </manifest>
2、创建一个服务类继承Service
代码
/** * 启动服务方式1 startService * 要重写3个方法: * onCreate():创建服务 * onStartCommand():服务开始运行 该方法可以调用多次(在2.0以前版本中,使用onStart()回调 * 方法) * onDestroy() :服务被停止 * * @author Administrator * */ public class MyService extends Service { @Override public void onCreate() { // TODO Auto-generated method stub Log.i("data", "服务端onCreate方法"); super.onCreate(); } @Override//该方法是启动服务第二种方式调用(bindService) public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.i("data", "服务端onBind方法"); return null; } @Override//启动服务 服务开始运行(耗时并且要后台执行的功能(例如后台下载或音乐播放)可以在这里实现) public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub Log.i("data", "服务端onStartCommand方法"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.i("data", "服务端onDestroy方法"); } }
3、MainActivity.java类
代码
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //启动服务的按钮点击事件监听 public void startService(View view){ //使用意图 Intent intent = new Intent(this,MyService.class); switch(view.getId()){ case R.id.bt_startService: startService(intent);//启动服务(方式1) break; case R.id.bt_stopService: stopService(intent);//停止服务 break; } } }
当点击第一个按钮第一次时结果:
当点击第一个按钮第二次的时候:
当点击第二个按钮第一次的时候:
注释:在继续点击第二个按钮已经没有反应 因为服务在点击第依次时就调用了onDestroy方法停止了
想要服务在运行就需要在启动服务,onDestroy方法在按真机或(模拟器)也会调用
======================================================
启动服务方式2 -- bindService(Intent service, ServiceConnection conn, int flags)
//UI界面布局就2个按钮这就不写了
界面效果图示例:
1、在配置清单里注册服务
代码
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mybindservice" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".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=".MyBindService"></service> </application> </manifest>
2、创建一个类(服务)继承Service
代码
public class MyBindService extends Service { @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); Log.i("data", "服务的onCreate方法"); } @Override//返回一个IBinder对象 public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.i("data", "服务的onBind方法"); //1、要创建一个继承Binder类的内部类然后new创建好的类 //2、该方法会吧new出来的对象返回到MainActivity //3、重写ServiceConnection接口的onServiceConnected()方法 return new MyBinder(); } @Override public boolean onUnbind(Intent intent) { // TODO Auto-generated method stub Log.i("data", "服务的onUnbind方法"); return super.onUnbind(intent); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.i("data", "服务的onDestroy方法"); } //在这里实现一些耗时后台工作 class MyBinder extends Binder{ public void getBinder(){ Log.i("data", "服务的内部类MyBinder的getBinder方法"); } } }
3、MainActivity.java类
代码
public class MainActivity extends Activity { private MyBinder myBinder; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { //把服务那边onBind方法返回的IBinder对象转换成MyBindService类里, //创建继承Binder类的内部类对象 //该对象可以在MainActivity类调用MyBindService(服务)内部类的方法 //如果不这样获取MyBindService(服务)内部类的对象 自己在MainActivity类 //想直接声明MyBindService(服务)内部类的对象或者new对象,是不行的(可以自己试试) //有了MyBindService(服务)内部类的对象就可以调用MyBindService(服务)内部类的所有方法了 myBinder = (MyBinder) service; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //点击按钮的事件监听 public void myService(View view){ Intent intent = new Intent(this, MyBindService.class); switch(view.getId()){ case R.id.bt_bindService://绑定服务(启动服务) //第一个参数: Intent对象 -- 服务类 //第二个参数:重写ServiceConnection接口声明的对象 //第三个参数:如果没有bind的实例 就会自动创建 bindService(intent, connection, Context.BIND_AUTO_CREATE); break; case R.id.bt_stopService//取消绑定服务 unbindService(connection); break; } } }
点击第一个按钮第一次时:
注意:在点击第一个按钮第二次时没有再次调用onBind()方法,也就是说第二种启动服务方式和第一种startService启动
方式的不同,另外绑定服务的启动方式是随Activity消失而停止的不像startService启动方式不随Activity启动方式消失而停止
点击第二个按钮第一次时:
按真机或者模拟器的退出键时也和取消绑定服务一样调用onUnbind和onDestroy2个方法