zoukankan      html  css  js  c++  java
  • [Android学习笔记4]四大应用组件之一:Service 上

    一、什么是Service

    一个Service就是一个能够在后台执行长时操作的应用程序组件,并且不提供用户界面。一个应用程序组件能够启动一个Service,即使用户切换到另一个应用程序,这个Service也会继续在后台运行。另外,一个组件能够绑定一个跟它交互的Service,甚至是进程间通信(IPC)。例如,一个Service可以处理网络事务、播放音乐、执行文件I/O、或者跟CotentProvider交互,所有这些都是在后台完成的。

    二、Service的形式

    一个Service基本上有两种形式:

    1. 被启动(Started):

    当应用程序组件(如一个Activity)通过调用startService()方法启动的Service是“被启动(started)”的。Service一旦启动,它就能够无限期的在后台运行,即使启动它的组件被销毁。通常,一个被启动的Service执行一个单一操作,并且不给调用者返回结果。例如,这个Service可能在网络上下载或上传文件。当操作完成的时候,Service应该自己终止。

    2. 被绑定(Bound):

    当一个应用程序组件通过调用bindService()方法绑定的Service是“被绑定(bound)”的。一个被绑定的Service会提供一个允许组件跟Service交互的客户端接口,用于发送请求、获取结果、甚至是跨进程的进程间通信(IPC)。一个被绑定的Service的运行时间跟绑定它的应用程序组件一样长。多个组件能够绑定一个Service,但是只有所有这些绑定解绑,这个Service才被销毁。

    Service能够被启动,也能够被绑定,看程序是否实现了运行组件启动的onStartCommand()方法或者允许绑定的onBind()方法。

    三、Service的生命周期

    1.以被启动方式产生的Sevice独立于启动该Service的组件的生命周期而存在,直到组件调用stopService()方法或直到其自己调用stopSelf()来终止自己。

    2. 如果一个组件调用bindService()方法来创建这个Service(并且不调用onStartCommand()方法),那么这个Service只跟绑定的组件运行同样长的时间。一旦这个从所有的客户端解绑,系统就会销毁它。

    四、StartService方式实例

    StartService有两种方式:1.继承Service类;2.继承IntentService类;

    先看第一种方式,继承Service类。

    在清单文件中加入<Service></>标签:

        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.luoye.servicelearn.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=".ServiceShow"></service>
            
        </application>


    布局文件,声明两个Button,一个用于启动Service,一个用于停止Service

    <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"
    	>
    	
        <Button 
            android:id="@+id/start_service1"
           	android:layout_width="wrap_content"
           	android:layout_height="wrap_content"
           	android:text="StartService1"
           	android:onClick="buttonOnClickListener"
            />
        
        <Button 
            android:id="@+id/stop_service1"
           	android:layout_width="wrap_content"
           	android:layout_height="wrap_content"
           	android:text="StopService1"
           	android:onClick="buttonOnClickListener"
            />
        
    </LinearLayout>


    MainActivity.java

    package com.luoye.servicelearn;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.View;
    
    public class MainActivity extends Activity {
    	
    	
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    	
    	public void buttonOnClickListener(View v)
    	{
    		switch(v.getId())
    		{
    			case R.id.start_service1:
    				Intent intent_start = new Intent(this, ServiceShow.class);
    				startService(intent_start);  //启动Service
    				break;
    			case R.id.stop_service1:
    				Intent intent_stop = new Intent(this, ServiceShow.class);
    				stopService(intent_stop);   //停止Service
    				break;					
    		}
    		
    	}
    
    }
    


    ServiceShow.java

    package com.luoye.servicelearn;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    
    
    public class ServiceShow extends Service{
    
    	@Override
    	public IBinder onBind(Intent intent) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	@Override
    	public void onCreate() {      // Service创建时调用,在onStartCommand()之前调用,若Service存在,则不调用
    		// TODO Auto-generated method stub
    		super.onCreate();
    		System.out.println("Service Create");
    	}
    
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId) {  //每次StartService都会调用
    		// TODO Auto-generated method stub
    		System.out.println("Service Start Command");
    		return super.onStartCommand(intent, flags, startId);
    	}
    
    	@Override
    	public void onDestroy() { //stopService()方法调用时,会调用该销毁函数
    		// TODO Auto-generated method stub
    		System.out.println("Service Stop");
    		super.onDestroy();
    	}
    }


    效果:

    1 点击Start按钮后,查看LogCat信息:

    调用了OnCreate()方法和onStartCommand()方法

    2 再次点击Start按钮后,查看LogCat信息:

    并没有重复调用OnCreate方法,而是调用了onStartCommand方法

    3 点击Stop按钮后,查看Logcat信息:

    调用了Destroy方法

    4 再次点击Start按钮后,查看LogCat信息:

    调用了OnCreate()方法和onStartCommand()方法,说明先前的Service已被销毁,此次Service为重新创建。

    调用网上达人的一幅图作个总结:

    第二种方式:继承IntentService类

    IntentService执行以下操作:

    IntentService类执行以下操作:

    1.  创建一个独立与应用程序主线程的默认工作线程,执行所有的给onStartCommand()方法Intent的处理;

    2.  创建一个工作队列,以便每次只给你的onHandleIntent()方法实现传递一个Intent,因此你不必担心多线程的问题;

    3.  所有的启动请求都被处理之后终止这个服务,因此你不需要自己去调用stopSelf()方法

    4.  提供返回null的onBind()方法的默认实现;

    5.  提供一个给工作队列发送Intent对象的onStartCommand()方法的默认实现和onHandleIntent()方法的实现。

    所以这些加起来实际上只需要实现onHandleIntent()方法,来完成由客户提供的工作。当然别忘了构造函数,其中需调用父类构造函数。

    实例这里不再赘述,也用一个图作个总结:

  • 相关阅读:
    使用 ASP.NET Core 创建 Web API及链接sqlserver数据库
    SQLPrompt 最新版下载地址
    雷柏键鼠对码程序
    罗技无线鼠标接收器无法配对的详细解决办法
    Windows10安装NTP服务器
    查看udp端口及占用程序
    国人开发的api测试工具 ApiPost
    无法调用到appcode下的类
    Android 实时文件夹
    android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3202699.html
Copyright © 2011-2022 走看看