Android Service 之启动服务( startService() )

本文详细介绍了Android中的服务组件,包括启动服务和绑定服务的区别与应用场景。通过示例代码讲解了如何创建、启动及停止服务,并提供了两种实现服务的方式:继承Service和IntentService。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。
服务基本上分为两种形式:

启动
当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响。 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。例如,它可能通过网络下载或上传文件。 操作完成后,服务会自行停止运行。

绑定
当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

注:

服务可以同时以这两种方式运行,也就是说,它既可以是启动服务(以无限期运行),也允许绑定。问题只是在于您是否实现了一组回调方法:onStartCommand()(允许组件启动服务)和 onBind()(允许绑定服务)。

想详细了解请参考:
https://developer.android.google.cn/guide/components/services.html

启动服务:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.zking.shuanger_android_21_stratservices.MainActivity">



    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="启动服务"
        android:onClick="start"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止服务"
        android:onClick="stop"
        />


</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent(this,MyService.class);
    }
    public void start(View view){
        startService(intent);//启动服务
    }

    public void stop(View view){
        stopService(intent);//停止服务
    }

}

第一种:先写一个类继承Service,重写里面的几个方法onCreate() onStartCommand() onDestroy() onBind()

再使用清单文件声明服务(Service)。

应用组件(如 Activity)可以通过调用 startService() 方法并传递 Intent 对象(指定服务并包含待使用服务的所有数据)来启动服务。服务通过 onStartCommand() 方法接收此 Intent。onStartCommand()方法中可写服务启动时需要执行的操作,例如一些耗时的操作则需要另开一个子线程。

停止服务
stopSelf(); 在onStartCommond方法里面调用stopself方法时,不会马上停止,而是onStartCommond方法执行结束才会停止。 还有一点,调用stopself方法之后,service会执行onDestory方法。另外,如果onStartCommond中启动一个线程,调用stopself,线程也不会被杀死。

stopSelf(startId); 在其参数startId跟最后启动该service时生成的ID相等时才会执行停止服务。

MyService.java

public class MyService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("test","onBind");
        return null;
    }

    @Override
    public void onCreate() {
        Log.i("test","onCreate");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("test","onStartCommand");
       // startId:代表启动服务的次数,由系统生成。

        new MyThread(startId).start();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.i("test","onDestroy");
        super.onDestroy();
    }

    class MyThread extends Thread{
        private int startId;
//        stopSelf();
//         在onStartCommond方法里面调用stopself方法时,不会马上停止,而是onStartCommond方法执行结束才会停止。
//        还有一点,调用stopself方法之后,service会执行onDestory方法。
//        另外,如果onStartCommond中启动一个线程,调用stopself,线程也不会被杀死。
//
//        stopSelf(startId); 在其参数startId跟最后启动该service时生成的ID相等时才会执行停止服务。
        public MyThread(int startId){
            this.startId = startId;
        }
        @Override
        public void run() {
            super.run();
            for (int i = 0; i <10 ; i++) {
                Log.i("test","雷好"+i);
                SystemClock.sleep(100);
            }
        }

    }

}

使用清单文件声明服务(Service)。
AndroidManifest.xml

<manifest ... >
  ...
  <application ... >
     <service android:name=".MyService" android:exported="true"></service>
      ...
  </application>
</manifest>

第二种:
写一个类继承IntentService, 重写onHandleIntent()( 类似于Service中的onStartCommand()方法 ),注意写构造方法,
使用清单文件声明服务(Service)。
在onHandleIntent()写所需执行的代码。

MyService2.java

public class MyService2 extends IntentService{
    public MyService2(){
        super("");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
         for (int i = 0; i <10 ; i++) {
                Log.i("test","雷好"+i);
                SystemClock.sleep(100);
            }
    }
}

使用清单文件声明服务(Service)。
AndroidManifest.xml

<manifest ... >
  ...
  <application ... >
     <service android:name=".MyService2" android:exported="true"></service>
      ...
  </application>
</manifest>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值