• Android项目之HomeHealth基础学习2:Service


    一、 Service简单介绍

    Service是android 系统中的四大组件之中的一个(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别几乎相同,但不能自己执行仅仅能后台执行,而且能够和其它组件进行交互。service能够在非常多场合的应用中使用,比方播放多媒体的时候用户启动了其它Activity这个时候程序要在后台继续播放。比方检測SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等。总之服务总是藏在后台的。

    Service的启动有两种方式:context.startService() 和 context.bindService()


    二、 Service启动流程

    context.startService() 启动流程:

    context.startService()  -> onCreate()  -> onStart()  -> Service running  -> context.stopService()  -> onDestroy()  -> Service stop 


    假设Service还没有执行。则android先调用onCreate(),然后调用onStart();

    假设Service已经执行,则仅仅调用onStart()。所以一个Service的onStart方法可能会反复调用多次。 

    假设stopService的时候会直接onDestroy。假设是调用者自己直接退出而没有调用stopService的话。Service会一直在后台执行,该Service的调用者再启动起来后能够通过stopService关闭Service。

    所以调用startService的生命周期为:onCreate --> onStart (可多次调用) --> onDestroy


    context.bindService()启动流程:

    context.bindService()  -> onCreate()  -> onBind()  -> Service running  -> onUnbind()  -> onDestroy()  -> Service stop
     

    onBind()将返回给client一个IBind接口实例,IBind同意client回调服务的方法。比方得到Service的实例、执行状态或其它操作。这个时候把调用者(Context,比如Activity)会和Service绑定在一起。Context退出了,Srevice就会调用onUnbind->onDestroy对应退出。

    所以调用bindService的生命周期为:onCreate --> onBind(仅仅一次,不可多次绑定) --> onUnbind --> onDestory。

    在Service每一次的开启关闭过程中,仅仅有onStart可被多次调用(通过多次startService调用),其它onCreate,onBind。onUnbind,onDestory在一个生命周期中仅仅能被调用一次。

     


    三、 Service生命周期 

    Service的生命周期并不像Activity那么复杂,它仅仅继承了onCreate()、onStart()、onDestroy()三个方法

    当我们第一次启动Service时。先后调用了onCreate()、onStart()这两个方法;当停止Service时,则运行onDestroy()方法。

    这里须要注意的是,假设Service已经启动了,当我们再次启动Service时,不会在运行onCreate()方法,而是直接运行onStart()方法。

    它能够通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停止自己,仅仅要调用一次stopService()方法便能够停止服务。不管调用了多少次的启动服务方法。


    四、 代码演示样例

    (1)startService演示样例

    project包含两个类:MainActivity.java,PlayService.java

    当中:MainActivity.java定义了两个button。分别控制音乐的播放与停止。

    用startService和stopService完毕Activity与Service之间的切换,启动Service以及取消Service,假设不用button。能够在Activity的OnCreate和OnDestrpy里面启动和取消Service

    AndroidManifest.xml文件例如以下:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.serviceactivity"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="19" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            
            <service android:enabled="true" android:name=".PlayService" />
        </application>
        
    </manifest>

    layout布局文件activity_main.xml

    <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
        <Button 
            android:id="@+id/button_on"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="open"/>
    	
    	<Button 
            android:id="@+id/button_off"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/button_on"
            android:text="close"/>
    	
    	<TextView 
    	    android:id="@+id/txt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/button_off"
            android:text="we will via"
    	    />
    
    
    </RelativeLayout>
    


    MainActivity.java代码例如以下:

    package com.example.hellowendy;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity implements OnClickListener {
    	/** Called when the activity is first created. */
    	Button buttonOn, buttonOff;
    	String TAG = "ServiceActivity";
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		buttonOn = (Button) findViewById(R.id.button_on);
    		buttonOff = (Button) findViewById(R.id.button_off);
    
    		buttonOn.setOnClickListener(this);
    		buttonOff.setOnClickListener(this);
    		Log.v(TAG, "ActivityonCreate");
    	}
    
    	@Override
    	public void onClick(View v) {
    		// TODO Auto-generated method stub
    		switch (v.getId()) {
    
    		case (R.id.button_on):
    			Log.v(TAG, "ActivitystartService");
    			this.startService(new Intent(this, PlayService.class));
    			// startService(new Intent(this, PlayService.class));
    
    			break;
    		case (R.id.button_off): {
    			Log.v(TAG, "ActivitystopService");
    			this.stopService(new Intent(this, PlayService.class));
    			// stopService(new Intent(this, PlayService.class));
    
    		}
    			break;
    
    		default:
    			break;
    
    		}
    
    	}
    
    	@Override
    	protected void onStop() {
    		// TODO Auto-generated method stub
    		super.onStop();
    		Log.v(TAG, "ActivityonStop");
    	}
    
    	@Override
    	protected void onDestroy() {
    		// TODO Auto-generated method stub
    		Log.v(TAG, "ActivityonDestroy");
    		super.onDestroy();
    
    	}
    
    }
    


    PlayService.java代码例如以下:

    /**
     * 
     */
    /**
     * @author Administrator
     *
     */
    package com.example.hellowendy;
    
    import java.io.IOException;
    
    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.os.IBinder;
    import android.util.Log;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class PlayService extends Service {
    	String TAG = "ServiceActivity";
    	MediaPlayer mediaPlayer;
    
    	@Override
    	public IBinder onBind(Intent intent) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	@Override
    	public void onCreate() {
    		// TODO Auto-generated method stub
    		super.onCreate();
    		Toast.makeText(this, "Play Service Created", Toast.LENGTH_LONG).show();
    		Log.v(TAG, "ServiceonCreate");
    		
    		//TextView txtview;
    		
    		//txtview = (TextView) findViewById(R.id.txt);
    		
    <span style="white-space:pre">		</span>//从本地资源中获取的歌曲cong.mp3, “匆匆那年”,<span style="color:#ff0000;font-family: 'black Verdana', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px;">cong.mp3文件夹是hellowendy -> res</span><span style="font-family: 'black Verdana', Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px;"><span style="color:#ff0000;"> ->raw -> cong.mp3</span></span>
    		mediaPlayer = MediaPlayer.create(this, R.raw.cong);
    
    	}
    
    	@Override
    	public void onStart(Intent intent, int startId) {
    		// TODO Auto-generated method stub
    		//super.onStart(intent, startId);
    		//super.onStart();
    		/*
    		 * //能够在OnCreate里面创建与音乐的链接。也能够在OnStart里面创建 mediaPlayer =
    		 * MediaPlayer.create(this, R.raw.test);
    		 */
    		Toast.makeText(this, "Play Service onStart", Toast.LENGTH_LONG).show();
    		Log.v(TAG, "ServiceonStart");
    		mediaPlayer.start();
    	}
    
    	@Override
    	public void onDestroy() {
    		// TODO Auto-generated method stub
    		super.onDestroy();
    		Toast.makeText(this, "Play Service Stopped", Toast.LENGTH_LONG).show();
    		Log.v(TAG, "ServiconDestroy");
    		mediaPlayer.stop();
    	}
    
    }







  • 相关阅读:
    Redis做为缓存的几个问题
    Python——操作smb文件服务器(上传和下载)
    Python——assert、isinstance的用法
    centos7-修改默认python为3
    mqtt
    如何编译生成 mkfs.ubifs、ubinize 工具
    2020-2笔记
    2020-1笔记
    C语言中getopt()和getopt_long()函数的用法
    buildroot
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6878713.html
Copyright © 2020-2023  润新知