Service启动模式

Service简单介绍

Service表示服务。是Android系统的核心组件之中的一个。

Service的本质是一个继承了android.app.Service的java类;

每个Service都应该在AndroidMainfest.xml文件里进行注冊;

Service由Android系统进行维护。

Service没有匹配的用户界面,通经常使用于后台处理耗时操作。

不同意在主线程中运行耗时操作。

Service是执行在主线程中的;

虽然Service被定位为“用于处理耗时操作”。可是各种耗时操作须要在Service中另外开辟线程来完毕。

组件能够绑定到Service,实现进程间通信(Inter Process Communication)。

进程优先级:

Android系统力图维护尽可能多的线程,但因为设备性能有限。在动态管理内存的过程中。Android系统

会常常可以终止一些优先级低的进程。以释放资源,保证优先级高的进程正常执行。

进程优先级分类:

1、前台进程(Forground Process)

2、可见进程(Visible Process)

3、服务进程(Service Process)

4、后台进程(BackGround Process)

5、空进程(Empty Process)

启动Service

开发者能够使用Intent激活Service组件。

激活Service组件的方式有:

调用Context定义的startService()方法(启动)

调用Context定义的bindService()方法(绑定)

启动Service的开发流程

启动Service的开发流程例如以下:

1、创建java类。继承android.app.Service;(Service中定义了抽象方法onBlind(),该方法必须被重写。但不一定须要被详细实现)

2、在AndroidMainfest.xml中的<application>下加入<service>子节点,

配置创建的Service;

3、在Activity中调用startService(Intent intent)方法启动Service;

显式或隐式启动Service

不管是显式Intent或隐式Intent都能够激活Service组件。

假设须要实现进程间通信,则应该为Service组件配置隐式意图过滤器。

停止Service

通过调用Context的stopService(Intent intent)方法能够停止Service,并销毁该Service组件。

在Service中调用stopSelf()方法能够停止自身。

Service的生命周期

假设Activity重复调用startService()方法。在Service中仅仅会重复调用onStartCommand()方法。

案例:

<Button
	           android:id="@+id/btn_start"
		   android:layout_width="match_parent"
		   android:layout_height="wrap_parent"
		   android:layout_alignParentTop="true"
		   android:layout_centerHorizontal="true"
		   android:layout_marginTop="50dp"
		   android:onClick="doStart"
		   android:text="Start Service"/>

               <Button
	           android:layout_marginTop="20dp"
	           android:id="@+id/btn_stop"
		   android:layout_width="match_parent"
		   android:layout_height="wrap_parent"
		   android:layout_alignParentTop="true"
		   android:layout_centerHorizontal="true"
		   android:layout_marginTop="50dp"
		   android:onClick="doStop"
		   android:text="Start Service"/>
public void doStart(View view){
		       Intent intent = new Intent(this,SampleService.class);
		       startService(intent);
		}

		public void doStop(View view){
		   Intent intent = new Intent(this,SampleService.class);
		       stopService(intent);
		}

Service类:

public class SampleService exteds Service{

      public void onCreate(){
      Log.d(tag,"onCreate")
         super.onCreate();
      }

      public int onStartCommand(Intent intent,int flags,int startId){
      Log.d(tag,"onStartCommand");
      return super.onStartCommand(intent,flags,startId);

      }

      public void onDestroy(){
      Log.d(tag,"onDestroy");
         super.onDestroy();
      }

      }

AndroidMainfest.xml

<service android:name="com.edu.hpu.cn.SampleService"></service>

Service的粘性

Service的粘性:Service的粘性表现为其所在进程被意外中止后,该Service能否够自己主动又一次被启动。

默认情况下。使用startService()方式激活的Service组件是粘性的,则即使其所在进程被意外中止了。

稍后该Service依旧会被自己主动创建出来。

设置Service的粘性

在Service生命周期中onStartCommand()方法的返回值决定了Service的粘性。

该方法的返回值能够被设置为:

START_STICKY:粘性的。被意外中止后自己主动重新启动。但丢失原来用于激活它的Intent;

START_NOT_STICKY:非粘性的,被意外中止后不会自己主动重新启动。

START_REDELIVER_INTENT:粘性的且又一次发送Intent。即被意外中止后自己主动重新启动,且该Service

组件将得到原来用于激活它的Intent对象。

START_STICKY_COMPATIBILITY:START_STICKY的兼容版本号,并不担保onStartCommand()会被又一次调用。

案例:

Service播放音乐

使用系统的MediaPlayer类能够播放音乐,开发过程例如以下:

创建MediaPlayer对象,可直接使用无參数构造方法。

调用MediaPlaye的reset()方法重置(不必要);

调用MediaPlayer的setDataSource()方法设置须要播放的歌曲。

调用MediaPlayer的prepare()方法载入(缓冲)歌曲。

调用MediaPlayer的start()方法播放歌曲。

当退出时应该调用release()方法释放资源。

本例的业务逻辑:

通过Activity激活Service,且在Service中创建mediaPlayer的实例,实现歌曲的播放;

被播放的歌曲保存在模拟器的sdcard/Misic/中。

当Activity被停止时,停止播放歌曲的Service。

当Service被停止时,释放MediaPlayer的资源。

案例:

MainActivity:

package com.edu.hpu.service;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void startMusic(View view){
		Intent intent = new Intent(this,PlayerMusicService.class);
		startService(intent);
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		Intent intent = new Intent(this,PlayerMusicService.class);
		stopService(intent);
		super.onDestroy();
	}

}

布局:

<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"
    >

    <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="136dp"
        android:onClick="startMusic"
        android:text="播放音乐" />

</RelativeLayout>

Service类:

package com.edu.hpu.service;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Environment;
import android.os.IBinder;

public class PlayerMusicService extends Service{
    private MediaPlayer player;

	@Override
	public void onCreate() {
             try {
				 player = new MediaPlayer();
				 player.reset();
				 player.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Music/Groove Coverage - She.mp3");
				 player.prepare();
				 player.start();
			} catch (IllegalArgumentException e) {
				// TODO: handle exception
				e.printStackTrace();
			}catch(SecurityException e){
				e.printStackTrace();
			}
             catch(IllegalStateException  e){
 				e.printStackTrace();
 			}
             catch(IOException  e){
  				e.printStackTrace();
  			}

	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		player.release();
		player = null;
		super.onDestroy();
	}
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

}

配置:

 <service
         android:name="com.edu.hpu.service.PlayerMusicService"></service>
		   关于MediaPlayer
		      MediaPlayer支持主流的音频、视频文件的播放。亦支持播放
		      非本机的媒体文件;
		      MediaPlayer会开启子线程播放歌曲;
		      可调用pause()方法暂停播放,调用seekTo()方法快进到指定的
		      位置開始播放;
	              可调用prepareAsync()方法载入歌曲,并配置OnPreparedListener,
		      在监听器用调用MediaPlayer的start()方法;
		    通常为MediaPlayer配置OnCompletionListener,以实如今播放完毕后的处理;
时间: 2024-10-12 03:38:51

Service启动模式的相关文章

论Activity及启动模式,Fragment,Service的使用以及生命周期

Activity: 这是我总结出来的,介于Activity生命周期相对较多,我在Google官方的生命周期图上又加了几个常用的,便于大家理解 对于ACtivity,先说说启动模式(ps:复制党去死吧,这年头加一点自己的特色好吗): 1,默认模式,启动Activity的时候新建一个实例,然后推入栈中,生命周期从onCreate()开始(这是必须的) 2,singletop,顾名思义嘛,当Activity的实例在栈顶的时候,如果还要启动它,走onNewIntent(),应用实例:三条推送,点进去都是

第一章:Activity的生命周期和启动模式

Activity是Android中四大组件之首,所以需要重视,尤其是启动方式,在AndroidManifest.xml中的注册信息 (一)Activity的生命周期 1.1.1 正常情况下的生命周期 说明 (1)针对一个特定的Activity,第一次启动顺序:onCreate->onStart->onResume. (2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop (3)返回原Activity时,回调如下:onRestart->on

Activity的启动模式与flag详解

Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance.以下逐一举例说明他们的区别: standard:Activity的默认加载方法,即使某个Activity在 Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中.例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D .此时如

android83 Activity的生命周期,启动模式,返回时传递数据

#Android四大组件 * Activity * BroadCastReceiver * Service * ContentProvider #Activity生命周期 * oncreate:Activity对象创建完毕,但此时不可见 * onstart:Activity在屏幕可见,但是此时没有焦点(不能够点,不能够交互) * onResume:Activity在屏幕可见,并且获得焦点 * onPause:Activity此时在屏幕依然可见,但是已经没有焦点 * onStop:Activity

转载__Android--Activity的启动模式

http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html 前言 在一个Android应用中,不可避免的会包含多个Activity,当开启多个Activity之后,当按后退键时,一般会回退到上一个Activity,这一点和浏览器有点类似,但是需要注意的是Android系统只能回退到上一个Activity,没办法前进到下一个Activity,维护这个功能就需要了解到一个回退栈(Back Stack)的概念. 这篇博客就着重讲

Android-Activity的四状态、七生命周期、和四启动模式

一.四大基本组件简介: Android四大基本组件:Activity.Service.Content Provider.Broadcast Receiver Activity:活动视图 一个负责与用户交互的显示界面的组件. Service:服务:一个没有界面.运行在后台的服务. Content Provider:内容提供者,一个应用程序可以使用Content Provider来共享自己的数据,另一个应用想要使用该应用提供的数据时,可以通过ContentResolver来访问. Broadcast

Activity启动模式的深入分析

网上关于Activity启动模式的文章非常多,但是看起来都千篇一律,看完之后我们都能理解这4种启动模式,不过官方api对singleTask这个启动模式解释有些争议,导致我其实并没有真正理解这几种模式,特别是对实际开发到底怎么用还是一知半解,于是花了一天时间好好研究这4种启动模式. 首当其冲应该知道Task的概念,它是我们一系列操作连贯跳转activity形成的一个activity栈,后进先出也就是说当前看到的activity在最上面,关于Task的概念老罗一篇博客说的比较清楚,引自老罗博客:

Android开发艺术探索——第一章:Activity的生命周期和启动模式

Android开发艺术探索--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activity搬上来了,也确实,和Activity打交道的次数基本上是最多的,而且他的内容和知识点也是很多的,非常值得我们优先把他掌握,Activity中文翻译过来就是"活动"的意思,但是主席觉得这样翻译有些生硬,直接翻译成"界面"可能更好,的确,Activity主要也是用于UI效

Android进阶--Acticivity的启动模式

一.引言 我们在多次启动同一个Activity时,系统默认会重复创建多个实例,这样看上去便十分的愚蠢,所以android在设计时提供了启动模式来修改系统的默认行为.目前有四种启动模式:standard.singleTop.singleTask和singleInstance. 二.如何设置启动模式 1.我们可以通过AndroidMenifest为Activity指定启动模式 <activity android:name=".SecondActivity" android:confi