Android深入浅出系列之服务—Android中的Service(一)

本文详细介绍了Android Service的概念及其使用方法,包括Service与Activity的关系、如何创建和启动Service,并提供了具体的代码示例。

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

        前言

  Service是Android系统的组件之一,和Activity,Intent,Conent Provider并称Android四大天王,Service是不可见的,是没有界面的,是在后台运行的,Service一般处理比较耗时以及长时间运行的操作。我以前给一个电子商务网站做过一个Windows服务,就是一直审核用户下达的未审核的订单,如果符合某种规范则这个订单审核通过,这个服务是一直在运行的,就跟这个电子商务网站一直在线上跑一样,它能省掉很多人工的时间,所以说服务一般处理长时间工作的操作。

     我之前在看一本书上说到“即便是通过Activity启动的Service,也不会在相同的process进程当中运行,而是各自属于不同的进程”,我翻阅了Android的SDK

“A Service is not a separate process. The Service object itself does not imply it is running in its own process; unless otherwise specified, it runs in the same process as the application it is part of.”这句话的意思是说,Service不是一个独立的进程,服务对象本身并不意味着这是运行在其自己的进程内,它与应用程序运行在同一个进程当中。当书本和Android SDK两者的理论发生矛盾的时候,我们以Android SDK为主,所以我们认为Service和带起它的应用程序在一个进程当中。

 因为我们知道了Service和带起它的应用程序在一个进程当中,如果你的Service里的操作阻塞住了,就会导致整个应用程序没有响应,所以我们在Service里面新开一个线程。

  实现步骤

  一:布局文件编写

   <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      >
   <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="启动Service"
       android:id="@+id/start"
     />
    <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="取消Service"
       android:id="@+id/end"
    />
  </LinearLayout>

  二:代码文件编写

  2.1 MainActivity.java

  package com.menglin.service1;

  import android.app.Activity;
  import android.content.Intent;
  import android.content.IntentFilter;
  import android.os.Bundle;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;

  public class MainActivity extends Activity
  {
     // 声明Button对象
     private Button btn_start, btn_end;

     @Override
     public void onCreate(Bundle savedInstanceState)
     {
        super.onCreate(savedInstanceState);
        //加载布局文件main.xml
        setContentView(R.layout.main);
        //通过findViewById()方法得到两个Button对象
        btn_start = (Button)findViewById(R.id.start);
        btn_end = (Button)findViewById(R.id.end);
        //给按钮绑定监听单击事件
        btn_start.setOnClickListener(btn_start_listener);
        btn_end.setOnClickListener(btn_end_listener);
       }
 
     //监听单击事件
     private OnClickListener btn_start_listener = new OnClickListener()
     {
        @Override
        public void onClick(View v)
        {
           //创建一个Intent对象
           Intent intent = new Intent();
           //第一个参数是自己的这个类的对象,第二个参数是要调用的Service的对象
           intent.setClass(MainActivity.this, Service1.class);
           //启动服务
           startService(intent);
      }
   };
 
   //监听单击事件
   private OnClickListener btn_end_listener = new OnClickListener()
   {
      @Override
      public void onClick(View v)
      {    
         //创建一个Intent对象
         Intent intent = new Intent();
         //第一个参数是自己的这个类的对象,第二个参数是要调用的Service的对象
         intent.setClass(MainActivity.this, Service1.class);
         //关闭服务
         stopService(intent);
      }
   };
 }

 2.2 Service1.java

    我们的这个具体服务的代码,在这里就不在过多介绍,

  package com.menglin.service1;

  import android.app.Service;
  import android.content.Intent;
  import android.os.IBinder;
  import android.util.Log;

  public class Service1 extends Service
  {

     private String TAG = "service";

     @Override
     public IBinder onBind(Intent intent)
     {
        // TODO Auto-generated method stub
        return null;
     }

     //当启动Service的时候会调用这个方法
     @Override
     public void onCreate()
     {
        Log.i(TAG, "onCreate");
        super.onCreate();
     }

     //当系统被销毁的时候会调用这个方法
     @Override
     public void onDestroy()
     {
        Log.i(TAG, "onDestroy");
        super.onDestroy();
     }

     //当启动Service的时候会调用这个方法
     @Override
     public int onStartCommand(Intent intent, int flags, int startId)
     {
        Log.i(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
     }

  }

  三:项目定义文件

  AndroidMainfest.xml

  为了让Android的系统知道有这个我们自定义的服务,所以我们需要加上service节点<service android:name=".Service1"></service>。   

  运行效果如下

  当我们单击”启动Service“按钮后,发现系统输入了我们要的信息。我们再次点击“启动Service”按钮发现没有在调用onCreate()方法,而是调用了onStartCommand()方法,一个服务启动起来后,一直在后台运行,当你在想启动这个服务的话,就不会调用onCreate()方法了,因为这个服务已被创建了,而是直接调用onStartCommand()方法,一些主要的操作我们都是在onStartCommand()方法中实现的,就是我们在onStartCommand()方法中开启新的线程根据Activity传进来的Inetent对象来完成一些操作。当我们不需要这个Service的时候,我们可以单击”取消Service“按钮。在这里我们单击”取消Service“按钮,不仅会停止服务还会输出”onDestroy“。

  

  

   

  

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值