启动服务的两种方式

启动服务方式1  -- startService(Intent intent)

//结果日志猫里打印

 

UI界面图示例:

 

启动服务的两种方式_第1张图片

//界面就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;
  }
 }
}

 

 

 

当点击第一个按钮第一次时结果:

 

启动服务的两种方式_第2张图片

 

当点击第一个按钮第二次的时候:

 

启动服务的两种方式_第3张图片

 

当点击第二个按钮第一次的时候:

 

启动服务的两种方式_第4张图片

 

注释:在继续点击第二个按钮已经没有反应 因为服务在点击第依次时就调用了onDestroy方法停止了

想要服务在运行就需要在启动服务,onDestroy方法在按真机或(模拟器)也会调用

 

 

 

 

 

 

 

 

 

======================================================

 

 

 

 

 

启动服务方式2 -- bindService(Intent service, ServiceConnection conn, int flags)

 

 

//UI界面布局就2个按钮这就不写了

 

界面效果图示例:

 

启动服务的两种方式_第5张图片

 

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;
   }
 }
}

 

 

 

 

点击第一个按钮第一次时:

 

启动服务的两种方式_第6张图片

 

 

注意:在点击第一个按钮第二次时没有再次调用onBind()方法,也就是说第二种启动服务方式和第一种startService启动

方式的不同,另外绑定服务的启动方式是随Activity消失而停止的不像startService启动方式不随Activity启动方式消失而停止

 

 

 

点击第二个按钮第一次时:

 

启动服务的两种方式_第7张图片

 

按真机或者模拟器的退出键时也和取消绑定服务一样调用onUnbind和onDestroy2个方法

你可能感兴趣的:(service)