`
woshizn
  • 浏览: 209897 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

用一个MP3播放应用来体会Android中的Service

阅读更多

手机是人们生活中不可或缺的一个有用工具。我们在使用手机时,往往是多线程的,而且是会突然间断的。比如我们会一边浏览网页,一边听MP3。或者正在发短信的时候,突然打进来电话。这样我们必定会离开当前的用户界面。比如你会关闭MP3歌曲列表,去发短信,所以往往就需要有些程序在后台完成,暂时脱离屏幕。这时就可以用到Android中的Service
下面会用一个播放MP3的小应用来体会一下Android的Service


什么是Service
Android引入了Service的概念是为了处理后台进程。Service不实现任何用户界面。最常见的例子如:媒体播放器程序,它可以在转到后台运行的时候仍然能保持播放歌曲;或者如文件下载程序,它可以在后台执行文件的下载。
它跟Activity的级别差不多,但是他不能自己运行,需要通过某一个Activity或者其他Context对象来调用, Context.startService() 和 Context.bindService()。

Service的生命周期
Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy
我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。两种启动Service的方式有所不同。这里要说明一下的是如果你在Service的onCreate或者onStart做一些很耗时间的事情,最好在Service里启动一个线程来完成,因为Service是跑在主线程中,会影响到你的UI操作或者阻塞主线程中的其他事情。

创建一个Service
Android中已经定义了一个 ‘Service’类,所有其他的Service都继承于该类。Service类中定义了一系列的生命周期相关的方法,如: onCreate(), onStart(), onDestroy()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
长期推荐成都知名外企(英语好 C++ JAVA)
mail to:hot13399@163.com
http://woshizn.iteye.com/blog/1195498
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
启动Service
有了 Service 类我们如何启动他呢,有两种方法:
Context.startService()
Context.bindService()
在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 或者 selfStop() 方法被调用。另外如果一个 Service 已经被启动,其他代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。
另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方发,你可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。

用其他方式启动 Service
其实不光能从 Activity 中启动 Service ,还有一个很有用的方法是接收系统的广播,这就要用到 Receiver 。在 Mainfest 文件中配置你得 Receiver 能接收什么样的广播消息,那么即使你得程序没有显示给用户,你的 Service 也能启动。你要做的就是继承 android.content.BroadcastReceiver ,然后实现 onReceive(Context context, Intent intent) 方法,就可以启动你得 Service 了。这里不能 bindService 因为一个 Receiver 是一个短暂存在的对象,所以 bind 是没有什么意义的。

与 Service 通信并且让它持续运行
如果我们想保持和 Service 的通信,又不想让 Service 随着 Activity 退出而退出呢?
可以先 startService() 再 bindService()。当不需要绑定的时候再执行 unbindService() 方法,执行这个方法只会触发 Service 的 onUnbind() 而不会把这个 Service 销毁。这样就可以既保持和 Service 的通信,也不会随着 Activity 销毁而销毁了。

提高 Service 优先级
Android 系统对于内存管理有自己的一套方法,为了保障系统有序稳定的运行,系统内部会自动分配,控制程序的内存使用。当系统觉得当前的资源非常有限的时候,为了保证一些优先级高的程序能运行,就会杀掉一些他认为不重要的程序或者服务来释放内存。这样就能保证真正对用户有用的程序仍然再运行。如果你的 Service 碰上了这种情况,多半会先被杀掉。但如果你增加 Service 的优先级就能让他多留一会,我们可以用 setForeground(true) 来设置 Service 的优先级。
为什么是 foreground ? 默认启动的 Service 是被标记为 background,当前运行的 Activity 一般被标记为 foreground,也就是说你给 Service 设置了 foreground 那么他就和正在运行的 Activity 类似优先级得到了一定的提高。当让这并不能保证你得 Service 永远不被杀掉,只是提高了他的优先级。

MP3TestActivity.java提供控制界面
package com.android.mp3test;

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

public class MP3TestActivity extends Activity {

	private Button start;
	private Button stop;
	private Intent i;
	
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		start = (Button) this.findViewById(R.id.start);
		stop = (Button) this.findViewById(R.id.stop);
		
// 指向MP3播放Service的action
		i = new Intent("com.kennan.android.music");
		
		start.setOnClickListener(startListener);
		stop.setOnClickListener(stopListener);
		
	}

	private OnClickListener startListener = new OnClickListener() {

		public void onClick(View v) {
// 开始服务
			MP3TestActivity.this.startService(i);
		}

	};

	private OnClickListener stopListener = new OnClickListener() {

		public void onClick(View v) {
// 结束服务			
			MP3TestActivity.this.stopService(i);
		}
	};
}


MusicService.java提供MP3播放功能,在开启播放后,可以尝试退出应用程序界面。看是否音乐还在继续播放。

package com.android.mp3test;

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

public class MusicService extends Service {

	private MediaPlayer player;

	public IBinder onBind(Intent arg0) {
		return null;
	}

	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
// 在服务开始时,启动MP3播放
		player = MediaPlayer.create(this, R.raw.music);
		player.start();
	}

	public void onDestroy() {
// 在服务消灭时,关闭MP3播放		
		player.stop();
		super.onDestroy();
	}
}



layout/mean.xml
<?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"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
    
    <Button android:id="@+id/start"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:text="@string/start"
    		/>
       <Button android:id="@+id/stop"
       		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:text="@string/stop"
    		/>		
    		
</LinearLayout>



AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.android.mp3test" android:versionCode="1"
	android:versionName="1.0">
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name=".MP3TestActivity" 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="MusicService">
			<intent-filter>
				<action android:name="com.kennan.android.music" />
				<category android:name="android.intent.category.DEFAULT" />
			</intent-filter>
		</service>
	</application>
	<uses-sdk android:minSdkVersion="4" />

</manifest> 


参考项目结构

  • 大小: 13.2 KB
4
1
分享到:
评论

相关推荐

    Android课程第一次实验报告_Andorid应用程序Activity生命周期.docx

    Android 应用程序的生命周期是开发过程中至关重要的概念,它涉及到进程和组件的管理,以及系统如何根据资源需求和用户交互来决定何时启动、暂停、恢复或终止它们。本实验报告将深入探讨Android应用程序,尤其是...

    android项目实训心得体会.doc

    Android 项目实训心得体会 通过这篇文章,我们可以总结出以下知识点: 1. Android 项目实训的重要性:文章强调了实训的重要性,在实训中我们可以学到很多课堂中学不到的东西,实训让我们学会了很多关于 Android ...

    android实训心得体会.doc

    在Android实训过程中,学习了Android的控件、布局、Activity、Service等一系列根底知识,对整个Android的开发有了大致的了解。例如,学习了布局的使用,通过Layout文件夹下的配置文件,可以快速的形成界面,在配置...

    android培训心得体会.docx

    Android是一个基于Linux内核的半开源操作系统,尤其在移动设备领域广泛应用,由Google和开放手持设备联盟共同开发。通过Android培训,我们可以深入理解这一平台的特性和开发流程。 首先,Android的学习是一个逐步...

    android开发资料大全

    Android数据库最基础的一个例子(本人已测试,可以运行) 为launcher添加一个仿Mac的dock(附源码) 使用Gallery实现Tab 仿QQ--tab切换动画实例 Android 小项目之---猜扑克牌游戏 (附源码) fleep滑动切换tab(切换...

    大学毕业论文_基于Android的五子棋游戏设计

    坐标布局是指在Android开发中使用的一种布局方式,而Intent是用于组件之间进行交互的一种机制。AlertDialog用于创建对话框,用于展示信息、警告或请求用户输入。此外,文档还对五子棋算法的相关数据结构、分析规则、...

    大学生安卓期末课程设计、一看仿菜谱的App 包含源代码、使用手册和心得体会

    这需要一个个人信息界面,可以使用Android的EditText和Spinner等控件来实现。同时,为了保持数据同步,修改后的信息应实时更新到服务器。 在进行这样的课程设计时,学生将接触到以下知识点: - **Android Studio...

    Android天气预报widget的设计与实现毕业论文

    3.2 ANDROID应用程序组成 12 3.2.1 Avtivity介绍 12 3.2.2 Broadcast Intent Receiver介绍 13 3.2.3 Service介绍 14 3.2.4 Content Provider介绍 14 3.2.5 Intent介绍 15 3.3 ANDROID应用程序工程文件 17 第4章 天气...

    android开发介绍及心得.docx

    一个应用通常包含多个Activity,每个Activity代表一个单独的屏幕或功能页面。例如,登录页面、主菜单页面等。 - **Fragment**: Activity的一部分,用于模块化用户界面和业务逻辑。通过将界面划分为多个Fragment,...

    androids实习心得体会.doc

    通过半个月的实习,掌握了 Android 应用程序开发的一般流程,包括控件的使用、布局、Activity、Service 等基础知识。 一、Android 应用程序开发基础知识 * 控件的使用:掌握了基本控件的用法,例如 Button、...

    android猜鸡蛋小游戏

    一个Android应用通常由多个组件构成,如Activity、Service、BroadcastReceiver和ContentProvider。在这个猜鸡蛋游戏中,主要涉及的是Activity,它是用户界面和交互的核心。开发者可能创建了一个主Activity来展示游戏...

    轻松学Android开发

    10. **多线程和异步处理**:在Android中,主线程负责UI更新,因此理解和使用AsyncTask、Handler、Looper以及最近的Coroutines是提高应用性能的关键。 11. **网络编程**:HTTP/HTTPS请求、WebSocket通信、JSON解析和...

    刘备学Android

    - 使用Eclipse创建一个新的Android项目。 - 设置项目名称、最小SDK版本等信息。 - **2.2.2 运行并调试HelloAndroid** - 使用AVD或连接的真机运行项目。 - 设置断点,使用Eclipse进行调试。 - **2.3 Hello...

    基于Android的记事本的设计与开发(实验报告+源代码).pdf

    综上所述,这份基于Android的记事本设计与开发实验报告,为Android开发者提供了宝贵的实践案例,展示了如何运用核心组件构建一个完整的应用。同时,它也是一个教学资源,有助于学习者理解和掌握Android开发的基本...

    2012年最有价值的Android开发精品文章荟萃【800篇】

    对于希望提升应用程序用户体验的开发者来说,这是一个很好的学习资源。 ### Android应用开发设计模式 **作者:terry_龙** **主要内容:** 由terry_龙撰写的这9篇文章专注于介绍设计模式在Android应用开发中的应用...

    android学习资料

    在Android学习的广阔领域中,ApiDemos是一个重要的里程碑,它是Android SDK中附带的一个示例项目,旨在帮助开发者理解并探索Android API的各种功能。这个压缩包中的ApiDemos包含了丰富的代码实例,可以帮助我们深入...

    Android专业课程设计.doc

    在这个课程设计中,学生余安慧选择了“茶百科”作为设计题目,目的是利用Android平台开发一款能够方便用户查询茶类信息的软件。 设计目的: 在当今智能手机普及的时代,手机已成为人们获取信息的主要途径。茶百科...

    Android课程设计.pdf

    总的来说,这个Android课程设计项目是一个综合性的实践,涵盖了移动应用开发的多个关键环节,包括平台选择、需求分析、系统设计、数据库管理、UI设计、性能优化等,对于提升学生的实际开发能力和对Android生态系统的...

    Android核心分析 100多页

    - **Activity:** 展示用户界面的主要容器,一个应用程序可以包含多个Activity。 - **Intent:** 用于启动Activity和服务,以及在组件之间传递数据。 - **Service:** 在后台运行的任务,可以被其他组件启动。 -...

    安卓期末大作业/音乐播放器

    【安卓期末大作业/音乐播放器】项目是一个典型的Android应用开发实例,主要涵盖了移动设备上音乐播放功能的实现。这个项目不仅提供了源代码,还包含了开发者的心得体会和操作手册,为学习Android开发的同学提供了...

Global site tag (gtag.js) - Google Analytics