当前位置:文档之家› Android服务Service 详解

Android服务Service 详解

Android服务Service 详解
Android服务Service 详解

第8章 Android服务

? 8.1 Service起步? 8.1.1 Service的生命周期

? 8.1.2 绑定Activity和Service ? 8.1.3 在BroadcastReceiver中启动Ser..

? 8.2.1 获得系统服务? 8.2.2 在模拟器上模拟重力感应

? 8.3.1 计时器:Chronometer ? 8.3.2 预约时间Handler

? 8.3.4 在线程中更新GUI组件? 8.3.5 全局定时器AlarmManager(1)

? 8.3.5 全局定时器AlarmManager(2)? 8.3.5 全局定时器AlarmManager(3)

? 8.4.1 什么是AIDL服务? 8.4.2 建立AIDL服务的步骤(1)

? 8.4.2 建立AIDL服务的步骤(2)? 8.4.2 建立AIDL服务的步骤(3)

? 8.5 本章小结

第8章Android服务

服务(Service)是Android系统中4个应用程序组件之一(其他的组件详见3.2节的内容)。服务主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。通过AIDL服务可以实现不同进程之间的通信,这也是服务的重要用途之一。

本章内容

Service的生命周期

绑定Activity和Service

在BroadcastReceiver中启动Service

系统服务

时间服务

在线程中更新GUI组件

AIDL服务

在AIDL服务中传递复杂的数据

8.1 Service起步

Service并没有实际界面,而是一直在Android系统的后台运行。一般使用Service为应用程序提供一些服务,或不需要界面的功能,例如,从Internet下载文件、控制Video播放器等。本节主要介绍Service的启动和结束过程(Service的生命周期)以及启动Service的各种方法。

8.1.1 Service的生命周期

本节的例子代码所在的工程目录是src\ch08\ch08_servicelifecycle

Service与Activity一样,也有一个从启动到销毁的过程,但Service的这个过程比Activity简单得多。Service启动到销毁的过程只会经历如下3个阶段:

创建服务

开始服务

销毁服务

一个服务实际上是一个继承android.app.Service的类,当服务经历上面3个阶段后,会分别调用Service 类中的3个事件方法进行交互,这3个事件方法如下:

1.public void onCreate(); // 创建服务

2.public void onStart(Intent intent, int startId); // 开始服务

3.public void onDestroy(); // 销毁服务

一个服务只会创建一次,销毁一次,但可以开始多次,因此,onCreate和onDestroy方法只会被调用一次,而onStart方法会被调用多次。

下面编写一个服务类,具体看一下服务的生命周期由开始到销毁的过程。

1.package net.blogjava.mobile.service;

2.import android.app.Service;

3.import android.content.Intent;

4.import android.os.IBinder;

5.import android.util.Log;

6.

7.// MyService是一个服务类,该类必须从android.app.Service类继承

8.public class MyService extends Service

9.{

10. @Override

11. public IBinder onBind(Intent intent)

12. {

13. return null;

14. }

15. // 当服务第1次创建时调用该方法

16. @Override

17. public void onCreate()

18. {

19. Log.d("MyService", "onCreate");

20. super.onCreate();

21. }

22. // 当服务销毁时调用该方法

23. @Override

24. public void onDestroy()

25. {

26. Log.d("MyService", "onDestroy");

27. super.onDestroy();

28. }

29. // 当开始服务时调用该方法

30. @Override

31. public void onStart(Intent intent, int startId)

32. {

33. Log.d("MyService", "onStart");

34. super.onStart(intent, startId);

35. }

36.}

在MyService中覆盖了Service类中3个生命周期方法,并在这些方法中输出了相应的日志信息,以便更容易地观察事件方法的调用情况。

读者在编写Android的应用组件时要注意,不管是编写什么组件(例如,Activity、Service等),都需要在AndroidManifest.xml文件中进行配置。MyService类也不例子。配置这个服务类很简单,只需要在AndroidManifest.xml文件的标签中添加如下代码即可:

1.

其中android:enabled属性的值为true,表示MyService服务处于激活状态。虽然目前MyService是激活的,但系统仍然不会启动MyService,要想启动这个服务。必须显式地调用startService方法。如果想停止服务,需要显式地调用stopService方法,代码如下:

1.public void onClick(View view)

2.{

3. switch (view.getId())

4. {

5. case R.id.btnStartService:

6. startService(serviceIntent);

// 单击【Start Service】按钮启动服务

7. break;

8. case R.id.btnStopService:

9. stopService(serviceIntent);

// 单击【Stop Service】按钮停止服务

10. break;

11. }

12.}

其中serviceIntent是一个Intent对象,用于指定MyService服务,创建该对象的代码如下:

1.serviceIntent = new Intent(this, MyService.class);

然后单击【Stop Service】按钮,会在Message列中输出如下信息:

1.onDestroy

在讨论完服务的生命周期后,再来总结一下创建和开始服务的步骤。创建和开始一个服务需要如下3步:

(1)编写一个服务类,该类必须从android.app.Service继承。Service类涉及到3个生命周期方法,但这3个方法并不一定在子类中覆盖,读者可根据不同需求来决定使用哪些生命周期方法。在Service类中有一个onBind方法,该方法是一个抽象方法,在Service的子类中必须覆盖。这个方法当Activity与Service 绑定时被调用(将在8.1.3节详细介绍)。

(2)在AndroidManifest.xml文件中使用标签来配置服务,一般需要将标签的android:enabled属性值设为true,并使用android:name属性指定在第1步建立的服务类名。

(3)如果要开始一个服务,使用startService方法,停止一个服务要使用stopService方法。

8.1.2 绑定Activity和Service

本节的例子代码所在的工程目录是src\ch08\ch08_serviceactivity

如果使用8.1.1节介绍的方法启动服务,并且未调用stopService来停止服务,这个服务就会随着Android 系统的启动而启动,随着Android系统的关闭而关闭。也就是服务会在Android系统启动后一直在后台运行,直到Android系统关闭后服务才停止。但有时我们希望在启动服务的Activity关闭后服务自动关闭,这就需要将Activity和Service绑定。

通过bindService方法可以将Activity和Service绑定。bindService方法的定义如下:

1.public boolean bindService(Intent service,

ServiceConnection conn, int flags)

该方法的第1个参数表示与服务类相关联的Intent对象,第2个参数是一个ServiceConnection类型的变量,负责连接Intent对象指定的服务。通过ServiceConnection对象可以获得连接成功或失败的状态,并可以获得连接后的服务对象。第3个参数是一个标志位,一般设为Context.BIND_AUTO_CREATE。

下面重新编写8.1.1节的MyService类,在该类中增加了几个与绑定相关的事件方法。

1.package net.blogjava.mobile.service;

2.

3.import android.app.Service;

4.import android.content.Intent;

5.import android.os.Binder;

6.import android.os.IBinder;

7.import android.util.Log;

8.

9.public class MyService extends Service

10.{

11. private MyBinder myBinder = new MyBinder();

12. // 成功绑定后调用该方法

13. @Override

14. public IBinder onBind(Intent intent)

15. {

16. Log.d("MyService", "onBind");

17. return myBinder;

18. }

19. // 重新绑定时调用该方法

20. @Override

21. public void onRebind(Intent intent)

22. {

23. Log.d("MyService", "onRebind");

24. super.onRebind(intent);

25. }

26. // 解除绑定时调用该方法

27. @Override

28. public boolean onUnbind(Intent intent)

29. {

30. Log.d("MyService", "onUnbind");

31. return super.onUnbind(intent);

32. }

33. @Override

34. public void onCreate()

35. {

36. Log.d("MyService", "onCreate");

37. super.onCreate();

38. }

39. @Override

40. public void onDestroy()

41. {

42. Log.d("MyService", "onDestroy");

43. super.onDestroy();

44. }

45. @Override

46. public void onStart(Intent intent, int startId)

47. {

48. Log.d("MyService", "onStart");

49. super.onStart(intent, startId);

50. }

51. public class MyBinder extends Binder

52. {

53. MyService getService()

54. {

55. return MyService.this;

56. }

57. }

58.}

现在定义一个MyService变量和一个ServiceConnection变量,代码如下:

1.private MyService myService;

2.private ServiceConnection serviceConnection = new ServiceConnection()

3.{

4. // 连接服务失败后,该方法被调用

5. @Override

6. public void onServiceDisconnected(ComponentName name)

7. {

8.myService = null;

9. Toast.makeText(Main.this, "Service

Failed.", Toast.LENGTH_LONG).show();

10. }

11. // 成功连接服务后,该方法被调用。在该方法中可以获得MyService对象

12. @Override

13. public void onServiceConnected(ComponentName name, IBinder service)

14. {

15. // 获得MyService对象

16.myService = ((MyService.MyBinder) service).getService();

17. Toast.makeText(Main.this, "Service

Connected.", Toast.LENGTH_LONG).show();

18. }

19.};

最后使用bindService方法来绑定Activity和Service,代码如下:

1.bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);

如果想解除绑定,可以使用下面的代码:

1.unbindService(serviceConnection);

8.1.3 在BroadcastReceiver中启动Service

本节的例子代码所在的工程目录是src\ch08\ch08_startupservice

在8.1.1节和8.1.2节都是先启动了一个Activity,然后在Activity中启动服务。如果是这样,在启动服务时必须要先启动一个Activity。在很多时候这样做有些多余,阅读完第7章的内容,会发现实例43可以利用Broadcast Receiver在Android系统启动时运行一个Activity。也许我们会从中得到一些启发,既然可以在Broadcast Receiver中启动Activity,为什么不能启动Service呢?说做就做,现在让我们来验证一下这个想法。

先编写一个服务类,这个服务类没什么特别的,仍然使用前面两节编写的MyService类即可。在AndroidManifest.xml文件中配置MyService类的代码也相同。

下面来完成最关键的一步,就是建立一个BroadcastReceiver,代码如下:

1.package net.blogjava.mobile.startupservice;

2.

3.import android.content.BroadcastReceiver;

4.import android.content.Context;

5.import android.content.Intent;

6.

7.public class StartupReceiver extends BroadcastReceiver

8.{

9. @Override

10. public void onReceive(Context context, Intent intent)

11. {

12. // 启动一个Service

13. Intent serviceIntent = new Intent(context, MyService.class);

14. context.startService(serviceIntent);

15. Intent activityIntent = new Intent(context, MessageActivity.class);

16. // 要想在Service中启动Activity,必须设置如下标志

17. activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

18. context.startActivity(activityIntent);

19. }

20.}

如果安装本例后,在重新启动模拟器后并未出现如图8.4所示的信息提示框,最大的可能是没有在AndroidManifest.xml文件中配置BroadcastReceiver和Service,下面来看一下AndroidManifest.xml文件的完整代码。

1.

2.

3.package="net.blogjava.mobile.startupservice"

android:versionCode="1"

4.android:versionName="1.0">

5.

android:label="@string/app_name">

6.

android:theme="@android:style/Theme.Dialog">

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

现在运行本例,然后重启一下模拟器,看看LogCat视图中是否输出了相应的日志信息。

8.2 系统服务

在Android系统中有很多内置的软件,例如,当手机接到来电时,会显示对方的电话号。也可以根据周围的环境将手机设置成震动或静音。如果想把这些功能加到自己的软件中应该怎么办呢?答案就是"系统服务"。在Android系统中提供了很多这种服务,通过这些服务,就可以像Android系统的内置软件一样随心所欲地控制Android系统了。本节将介绍几种常用的系统服务来帮助读者理解和使用这些技术。

8.2.1 获得系统服务

系统服务实际上可以看作是一个对象,通过Activity类的getSystemService方法可以获得指定的对象(系统服务)。getSystemService方法只有一个String类型的参数,表示系统服务的ID,这个ID在整个Android 系统中是唯一的。例如,audio表示音频服务,window表示窗口服务,notification表示通知服务。

为了便于记忆和管理,Android SDK在android.content.Context类中定义了这些ID,例如,下面的代码是一些ID的定义。

1.public static final String AUDIO_SERVICE = "audio";

// 定义音频服务的ID

2.public static final String WINDOW_SERVICE = "window";

// 定义窗口服务的ID

3.public static final String NOTIFICATION_SERVICE =

"notification"; // 定义通知服务的ID

下面的代码获得了剪贴板服务(android.text.ClipboardManager对象)。

1.// 获得ClipboardManager对象

2.android.text.ClipboardManager clipboardManager=

3. (android.text.ClipboardManager)

getSystemService(Context.CLIPBOARD_SERVICE);

4.clipboardManager.setText("设置剪贴版中的内容");

在调用ClipboardManager.setText方法设置文本后,在Android系统中所有的文本输入框都可以从这个剪贴板对象中获得这段文本,读者不妨自己试一试!

窗口服务(WindowManager对象)是最常用的系统服务之一,通过这个服务,可以获得很多与窗口相关的信息,例如,窗口的长度和宽度,如下面的代码所示:

1.// 获得WindowManager对象

2.android.view.WindowManager windowManager = (android.view.WindowManager)

3.

4.

5.

6.getSystemService(Context.WINDOW_SERVICE);

7.// 在窗口的标题栏输出当前窗口的宽度和高度,例如,320*480

8.setTitle(String.valueOf(windowManager.getDefaultDisplay().getWidth()) + "*"

9. + String.valueOf

(windowManager.getDefaultDisplay().getHeight()));

本节简单介绍了如何获得系统服务以及两个常用的系统服务的使用方法,在接下来的实例47和实例48中将给出两个完整的关于获得和使用系统服务的例子以供读者参考。

实例47:监听手机来电

工程目录:src\ch08\ch08_phonestate

当来电话时,手机会显示对方的电话号,当接听电话时,会显示当前的通话状态。在这期间存在两个状态:来电状态和接听状态。如果在应用程序中要监听这两个状态,并进行一些其他处理,就需要使用电话服务(TelephonyManager对象)。

本例通过TelephonyManager对象监听来电状态和接听状态,并在相应的状态显示一个Toast提示信息框。如果是来电状态,会显示对方的电话号,如果是通话状态,会显示"正在通话..."信息。下面先来看看来电和接听时的效果,如图8.5和图8.6所示。

其中MyPhoneCallListener类是一个电话状态监听器,该类是PhoneStateListener的子类,代码如下:

1.public class MyPhoneCallListener extends PhoneStateListener

2.{

3. @Override

4. public void onCallStateChanged(int state, String incomingNumber)

5. {

6. switch (state)

7. {

8. // 通话状态

9. case TelephonyManager.CALL_STATE_OFFHOOK:

10. Toast.makeText(Main.this, "正在通话...",

Toast.LENGTH_SHORT).show();

11. break;

12. // 来电状态

13. case TelephonyManager.CALL_STATE_RINGING:

14. Toast.makeText(Main.this, incomingNumber,

Toast.LENGTH_SHORT).show();

15. break;

16. }

17. super.onCallStateChanged(state, incomingNumber);

18. }

19.}

实例48:来电黑名单

工程目录:src\ch08\ch08_phoneblacklist

虽然手机为我们带来了方便,但有时实在不想接听某人的电话,但又不好直接挂断电话,怎么办呢?很简单,如果发现是某人来的电话,直接将手机设成静音,这样就可以不予理睬了。

本例与实例47类似,也就是说,仍然需要获得TelephonyManager对象,并监听手机的来电状态。为了可以将手机静音,还需要获得一个音频服务(AudioManager对象)。本例需要修改实例47中的手机接听状态方法onCallStateChanged中的代码,修改后的结果如下:

1.public class MyPhoneCallListener extends PhoneStateListener

2.{

3. @Override

4. public void onCallStateChanged(int state, String incomingNumber)

5. {

6. // 获得音频服务(AudioManager对象)

7. AudioManager audioManager = (AudioManager)

getSystemService(Context.AUDIO_SERVICE);

8. switch (state)

9. {

10. case TelephonyManager.CALL_STATE_IDLE:

11. // 在手机空闲状态时,将手机音频设为正常状态

12. audioManager.setRingerMode

(AudioManager.RINGER_MODE_NORMAL);

13. break;

14. case TelephonyManager.CALL_STATE_RINGING:

15. // 在来电状态时,判断打进来的是否为要静

音的电话号,如果是,则静音

16. if ("12345678".equals(incomingNumber))

17. {

18. // 将电话静音

19. audioManager.setRingerMode

(AudioManager.RINGER_MODE_SILENT);

20. }

21. break;

22. }

23. super.onCallStateChanged(state, incomingNumber);

24. }

25.}

在上面的代码中,只设置了"12345678"为静音电话号,读者可以采用实例47的方法使用"12345678"打入电话,再使用其他的电话号打入,看看模拟器是否会响铃。

8.2.2 在模拟器上模拟重力感应

众所周知,Android系统支持重力感应,通过这种技术,可以利用手机的移动、翻转来实现更为有趣的程序。但遗憾的是,在Android模拟器上是无法进行重力感应测试的。既然Android系统支持重力感应,但又在模拟器上无法测试,该怎么办呢?别着急,天无绝人之路,有一些第三方的工具可以帮助我们完成这个工作,本节将介绍一种在模拟器上模拟重力感应的工具(sensorsimulator)。这个工具分为服务端和客户端两部分。服务端是一个在PC上运行的Java Swing GUI程序,客户端是一个手机程序(apk文件),在运行时需要通过客户端程序连接到服务端程序上才可以在模拟器上模拟重力感应。

读者可以从下面的地址下载这个工具:

1.https://www.doczj.com/doc/5810667986.html,/p/openintents/downloads/list

下面来测试一下SensorSimulator自带的一个demo,在这个demo中输出了通过模拟重力感应获得的数据。

在实例49中将给出一个完整的例子来演示如何利用重力感应的功能来实现手机翻转静音的效果。实例49:手机翻转静音

1.工程目录:src\ch08\ch08_phonereversal

与手机来电一样,手机翻转状态(重力感应)也由系统服务提供。重力感应服务

(android.hardware.SensorManager对象)可以通过如下代码获得:

1.SensorManager sensorManager = (SensorManager)

getSystemService(Context.SENSOR_SERVICE);

本例需要在模拟器上模拟重力感应,因此,在本例中使用SensorSimulator中的一个类(SensorManagerSimulator)来获得重力感应服务,这个类封装了SensorManager对象,并负责与服务端进行通信,监听重力感应事件也需要一个监听器,该监听器需要实现SensorListener接口,并通过该接口的onSensorChanged事件方法获得重力感应数据。本例完整的代码如下:

1.package net.blogjava.mobile;

2.

3.import org.openintents.sensorsimulator.hardware.SensorManagerSimulator;

4.import android.app.Activity;

5.import android.content.Context;

6.import android.hardware.SensorListener;

7.import android.hardware.SensorManager;

8.import android.media.AudioManager;

9.import android.os.Bundle;

10.import android.widget.TextView;

11.

12.public class Main extends Activity implements SensorListener

13.{

14. private TextView tvSensorState;

15. private SensorManagerSimulator sensorManager;

16. @Override

17. public void onAccuracyChanged(int sensor, int accuracy)

18. {

19. }

20. @Override

21. public void onSensorChanged(int sensor, float[] values)

22. {

23. switch (sensor)

24. {

25. case SensorManager.SENSOR_ORIENTATION:

26. // 获得声音服务

27. AudioManager audioManager = (AudioManager)

28.

getSystemService(Context.AUDIO_SERVICE);

29. // 在这里规定翻转角度小于-120度时静音,

values[2]表示翻转角度,也可以设置其他角度

30. if (values[2] <-120)

31. {

32. audioManager.setRingerMode

(AudioManager.RINGER_MODE_SILENT);

33. }

34. else

35. {

36. audioManager.setRingerMode

(AudioManager.RINGER_MODE_NORMAL);

37. }

38. tvSensorState.setText("角度:" +

String.valueOf(values[2]));

39. break;

40. }

41. }

42. @Override

43. protected void onResume()

44. {

45. // 注册重力感应监听事件

46. sensorManager.registerListener(this,

SensorManager.SENSOR_ORIENTATION);

47. super.onResume();

48. }

49. @Override

50. protected void onStop()

51. {

52. // 取消对重力感应的监听

53. sensorManager.unregisterListener(this);

54. super.onStop();

55. }

56. @Override

57. public void onCreate(Bundle savedInstanceState)

58. {

59. super.onCreate(savedInstanceState);

60. setContentView(https://www.doczj.com/doc/5810667986.html,yout.main);

61. // 通过SensorManagerSimulator对象获得重力感应服务

62.sensorManager = (SensorManagerSimulator) SensorManagerSimulator

63. .getSystemService(this, Context.SENSOR_SERVICE);

64. // 连接到服务端程序(必须执行下面的代码)

65. sensorManager.connectSimulator();

66. }

67.}

在上面的代码中使用了一个SensorManagerSimulator类,该类在SensorSimulator工具包带的sensorsimulator-lib.jar文件中,可以在lib目录中找到这个jar文件。在使用SensorManagerSimulator类之前,必须在相应的Eclipse工程中引用这个jar文件。

现在运行本例,并通过服务端主界面右侧的【Roll】滑动杆移动到指定的角度,例如,-74.0和-142.0,这时设置的角度会显示在屏幕上,如图8.14和图8.15所示。

读者可以在如图8.14和图8.15所示的翻转状态下拨入电话,会发现翻转角度在-74.0度时来电仍然会响铃,而翻转角度在-142.0度时就不再响铃了。

由于SensorSimulator目前不支持Android SDK 1.5及以上版本,因此,只能使用Android SDK 1.1中的SensorListener接口来监听重力感应事件。在Android SDK 1.5及以上版本并不建议继续使用这个接口,代替它的是android.hardware.SensorEventListener接口。

8.3.1 计时器:Chronometer

8.3 时间服务

在Android SDK中提供了多种时间服务。这些时间服务主要处理在一定时间间隔或未来某一时间发生的任务。Android系统中的时间服务的作用域既可以是应用程序本身,也可以是整个Android系统。本节将详细介绍这些时间服务的使用方法,并给出大量的实例供读者学习。

8.3.1 计时器:Chronometer

本节的例子代码所在的工程目录是src\ch08\ch08_chronometer

Chronometer是TextView的子类,也是一个Android组件。这个组件可以用1秒的时间间隔进行计时,并显示出计时结果。

Chronometer类有3个重要的方法:start、stop和setBase,其中start方法表示开始计时;stop方法表示停止计时;setBase方法表示重新计时。start和stop方法没有任何参数,setBase方法有一个参数,表示开始计时的基准时间。如果要从当前时刻重新计时,可以将该参数值设为SystemClock.elapsedRealtime()。

还可以对Chronometer组件做进一步设置。在默认情况下,Chronometer组件只输出MM:SS或H:MM:SS 的时间格式。例如,当计时到1分20秒时,Chronometer组件会显示01:20。如果想改变显示的信息内容,可以使用Chronometer类的setFormat方法。该方法需要一个String变量,并使用"%s"表示计时信息。例如,使用setFormat("计时信息:%s")设置显示信息,Chronometer组件会显示如下计时信息:计时信息:10:20

Chronometer组件还可以通过onChronometerTick事件方法来捕捉计时动作。该方法1秒调用一次。要想使用onChronometerTick事件方法,必须实现如下接口:

1.android.widget.Chronometer.OnChronometerTickListener

在本例中有3个按钮,分别用来开始、停止和重置计时器,并通过onChronometerTick事件方法显示当前时间,代码如下:

1.package net.blogjava.mobile;

2.

3.import java.text.SimpleDateFormat;

4.import java.util.Date;

5.import android.app.Activity;

6.import android.os.Bundle;

7.import android.os.SystemClock;

8.import android.view.View;

9.import android.view.View.OnClickListener;

10.import android.widget.Button;

11.import android.widget.Chronometer;

12.import android.widget.TextView;

13.import android.widget.Chronometer.OnChronometerTickListener;

14.

15.public class Main extends Activity implements

OnClickListener, OnChronometerTickListener

16.{

17. private Chronometer chronometer;

18. private TextView tvTime;

19. @Override

20. public void onClick(View view)

21. {

22. switch (view.getId())

23. {

24. case R.id.btnStart:

25. // 开始计时器

26. chronometer.start();

27. break;

28. case R.id.btnStop:

29. // 停止计时器

30. chronometer.stop();

31. break;

32. case R.id.btnReset

33. // 重置计时器:

34. chronometer.setBase(SystemClock.elapsedRealtime());

35. break;

36. }

37. }

Android系统精简列表对照表

安卓系统精简列表对照表,适用于大部分Android系统,大家请参考对照精简。AirkanPhoneService 可删 AntiSpam 可删 AdupsFot.apk无线升级(可删) AdupsFotaReboot.apk重启升级操作(可删) ApplicationGuide.apk-应用程度指南(不可删)ApplicationsProvider.apk-应用程序存储服务(不可删) AtciService.apk--系统服务(不可删) Backup.apk 可删 BackupRestoreConfirmation.apkGoogle邮箱的备份,可删BasicDreams.apk 4.2新增,休眠模式,不可删 BatteryWarning.apk--电池警告(建议保留) Browser.apk-谷歌浏览器(可删) BugReport 可删 Calculator.apk---计算器(可删) Calendar.apk日历(可删,换第三方日历) CalendarImporter.apk日历服务(同上) CalendarProvider.apk-日历存储(同上) CDS_INFO.apk--常见数据服务(不可删) CellBroadcastReceiver.apk小区广播(可删) CellConnService.apk---电话连接服务(不可删) CertInstaller.apk-证书安装,可删(亲测,没发现问题)

Cit可删 CloudService可删 ChromeBookmarksSyncAdapter.apk-Google书签同步(可删) com.google.android.apps.docs.apk--云端硬盘(可删) com.google.android.apps.maps.apk-谷歌地图(可删) com.google.android.googlequicksearchbox.apk-Google搜索(可删) com.google.android.street.apk--街景视图(可删) Contacts.apk--通讯录/联系人(不可删) ContactsProvider.apk--通讯录/联系人数据存储服务(不可删)DataHubProvider.apk. 会导致流量红圈不可删 DataTransfer.apk-备份与恢复(可删) DataUsageLockScreenClient.apk数据应用和锁定屏幕客户端(不可删)DefaultContainerService.apk-默认存储服务(不可删) DeskClock.apk闹钟,时钟(建议保留) DownloadProvider.apk 下载管理器,可删(删了就不能在谷歌电子市场和谷歌浏览器下载东西了,需要的留着) DownloadProviderUi.apk 下载内容,可删(同上) DrmProvider.apk 受DRM保护的内容的存储,可删(有DRM保护的东西就留着这个)Email.apk-电子邮件(可删) EngineerMode.apk--工程模式(不可删) EngineerModeSim.apksim卡工程模式(不可删) EventReceiver 翻译过来就是事件接收还是别删了这个网上没查到多少资料

Android的系统服务一览

Android的系统服务一览 System_Server进程 运行在system server进程中的服务比较多,这是整个android框架的基础 Native服务 SurfaceFlinger 这是framebuffer合成的服务,将各个应用程序及应用程序中的逻辑窗口图像数据(surface)合成到一个物理窗口中显示(framebuffer)的服务程序 Java服务: 这部分的服务大部分都有一个供应用进程使用的manager类,这就是一个RPC 调用,用户通过调用xxxManager的方法,实际上被Binder给迁移到system_server 进程中对应的xxxManagerService中对应的方法,并将结果再通过binder带回。 1. EntropyService 熵服务,周期性的加载和保存随机信息。主要是linux开机后,/dev/random的状态可能是可预知的,这样一些需要随机信息的应用程序就可能会有问题。这个无需提供应用程序接口。 2. PowerManagerService –> PowerManager Android 的电源管理也是很重要的一部分。比如在待机的时候关掉不用的设备,待机时屏幕和键盘背光的关闭,用户操作的时候该打开多少设备等等。 3. ActivityManagerService->ActivityManager 这个是整个Android framework框架中最为核心的一个服务,管理整个框架中任务、进程管理, Intent解析等的核心实现。虽然名为Activity的Manager

Service,但它管辖的范围,不只是Activity,还有其他三大组件,和它们所在的进程。也就是说用户应用程序的生命管理,都是由他负责的。 4. TelephonyRegistry->TelephonyManager 电话注册、管理服务模块,可以获取电话的链接状态、信号强度等等。<可以删掉,但要看的大概明白> 5. PackageManagerService -> PackageManager 包括对软件包的解包,验证,安装以及升级等等,对于我们现在不能安装.so文件的问题,应该先从这块着手分析原因。 6. AccountManagerService -> AccountManager A system service that provides account, password, and authtoken management for all accounts on the device。 7. ContentService -> ContentResolver 内容服务,主要是数据库等提供解决方法的服务。 8. BatteryService 监控电池充电及状态的服务,当状态改变时,会广播Intent 9. HardwareService 一般是ring和vibrate的服务程序 10. SensorService -> SensorManager 管理Sensor设备的服务,负责注册client设备及当client需要使用sensor时激活Sensor 11. WindowManagerService -> WindowManager -> PhoneWindowManager 和ActivityManagerService高度粘合 窗口管理,这里最核心的就是输入事件的分发和管理。 12. AlarmManagerService -> AlarmManager 闹钟服务程序

最新Android应用程序绑定服务bindService的过程源代码分析汇总

A n d r o i d应用程序绑定服务b i n d S e r v i c e 的过程源代码分析

Android应用程序组件Service与Activity一样,既可以在新的进程中启动,也可以在应用程序进程内部启动;前面我们已经分析了在新的进程中启动Service的过程,本文将要介绍在应用程序内部绑定Service的过程,这是一种在应用程序进程内部启动Service的方法。 在前面一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划中,我们就曾经提到,在Android系统中,每一个应用程序都是由一些Activity和Service组成的,一般Service运行在独立的进程中,而Activity有可能运行在同一个进程中,也有可能运行在不同的进程中;在接下来的文章中,Android系统在新进程中启动自定义服务过程(startService)的原理分析一文介绍了在新的进程中启动Service的过程,Android应用程序启动过程源代码分析一文介绍了在新的进程中启动Activity的过程,而Android应用程序内部启动Activity过程(startActivity)的源代码分析一文则介绍了在应用程序进程内部启动Activity的过程;本文接过最后一棒,继续介绍在应用程序进程内部启动Service的过程,这种过程又可以称在应用程序进程内部绑定服务(bindService)的过程,这样,读者应该就可以对Android应用程序启动Activity和Service有一个充分的认识了。 这里仍然是按照老规矩,通过具体的例子来分析Android应用程序绑定Service的过程,而所使用的例子便是前面我们在介绍Android系统广播机制的一篇文章Android系统中的广播(Broadcast)机制简要介绍和学习计划中所开发的应用程序Broadcast了。 我们先简单回顾一下这个应用程序实例绑定Service的过程。在这个应用程序的MainActivity的onCreate函数中,会调用bindService来绑定一个计数器服务CounterService,这里绑定的意思其实就是在MainActivity内部获得CounterService的接口,所以,这个过程的第一步就是要把CounterService 启动起来。当CounterService的onCreate函数被调用起来了,就说明CounterService已经启动起来了,接下来系统还要调用CounterService的onBind函数,跟CounterService要一个Binder对象,这个Binder对象是在CounterService内部自定义的CounterBinder类的一个实例,它继承于Binder类,里面实现一个getService函数,用来返回外部的CounterService接口。系统得到这个Binder对象之后,就会调用MainActivity在bindService函数里面传过来的ServiceConnection实例的onServiceConnected函数,并把这个Binder对象以参数的形式传到onServiceConnected函数里面,于是,MainActivity就可以调用这个Binder对象的getService函数来获得CounterService的接口了。 这个过程比较复杂,但总体来说,思路还是比较清晰的,整个调用过程为MainActivity.bindService->CounterService.onCreate->CounterService.onBind- >MainActivity.ServiceConnection.onServiceConnection->CounterService.CounterBinder.getService。下面,我们就先用一个序列图来总体描述这个服务绑定的过程,然后就具体分析每一个步骤。

能够删除的安卓(Android)系统自带程序详细列表

能够删除的安卓(Android)系统自带程序详细列表 注:删除前请先备份 有机友因为删除了系统自带的一些程序,使得手机出现很大的问题,只有重新刷机才可以解决。这份表单,供各位在删除程序的时候做个参考。Android手机系统中默认会自带很多无用程序,这些应用,平时很少用不到,但因为是系统自带的,所以它们像牛皮癣一样内嵌在手机里,无法去除。下面列举一些能够删除和不能够删除的软件列表,希望对G友有用!怎么删除呢?当然是下载一个Root Explorer来删除(需要完全ROOT) 注意: 1. 有*号是绝不可删的,否则会出现严重问题; 2. 删除系统自带程序前,请注意备份; 3. 因不同版本的Android系统和不同品牌手机的定制,会有差异导致系统自带程序列表有差异,但大体上一致,请大家自己斟酌。 自带的软件列表: *AccountAndSyncSettings.apk 同步与帐户设定(绝不能删除) *ApplicationsProvider.apk 应用程序支持服务(绝不能删除)Bluetooth.apk 蓝牙(删除后蓝牙功能消失)Browser.apk 系统自带浏览器(可用其他手机浏览器替代) Calculator.apk 计算器(可删,可用其他替代)Calendar.apk 日历(可删) CalendarProvider.apk 日历程序支持服务(可删) *Camera.apk 自带相机(绝不能删除) *CertInstaller.apk 证书服务(绝不能删除) Contacts.apk 通讯录/联系人(用第三方通讯录的可删)*ContactsProvider.apk 通讯录/联系人数据存储服务(绝不能删除)*DefaultContainerService.apk 默认通讯录服务(绝不能删除) DeskClock.apk 自带闹钟(用第三方闹钟的可删) *DownloadProvider.apk 下载管理器(绝不能删除) *DrmProvider.apk DRM受保护数据存储服务(绝不能删除)DSPManager.apk DSP音频管理(可删) Email.apk Email(不用自带Email接受邮件的可删)FileManager.apk 简易文件管理器(可删,可用ES文件管理器替代) Gallery3D.apk 3D图片浏览器(可删) GenieWidget.apk 天气与新闻(可删) Gmail.apk Gmail(可删)GoogleBackupTransport.apk ***(未知程序,可删)GoogleCalendarSyncAdapter.apk 存储日历信息(可删)GoogleContactsSyncAdapter.apk 存储联系人信息(可删) GoogleFeedback.apk ***(据说删除后开机会提示GoogleFeedback.apk,根据自身情况决定是否删除) GooglePartnerSetup.apk Google助手(可删)

6.1 系统服务概述

6.1系统服务概述

第1节 Android服务概述第2节系统服务 第3节自定义服务 第4节多线程

?理解Android服务的作用。 ?理解Android服务的运用场合。 ?理解访问Android系统服务的方法。 ?能熟练访问各种多媒体服务 ◆定时服务:Alarm Service ◆壁纸服务:Wallpaper Service ◆媒体服务:Audio Service ?能熟练访问各种系统服务 ◆通知服务:Notification Service ◆窗口服务:Window Service ◆活动服务:Activity Service ◆电话服务:Telephony Service ◆网络服务:Connectivity Service

6.1 系统服务概述 知识点预览 # 知识点重点难点应用说明 1 Windows服务理解Windows操作系统中服务的作用。 2 Android服务√理解Android系统中服务的作用。 3 Android服务分类√√理解Android系统中服务的各种分类。 4 Android系统服务创建过程√理解Android系统服务存在的意义和地位。 5 Android系统服务应用场景√√理解Android系统服务的应用场景和作用。

1 Android 服务概述 ? 1 什么是Windows服务? ◆服务与运行在Windows操作系统中应用程序一样都是的一个进程。 ◆服务是一个特殊的进程,特点在于没有图形用户界面(GUI)。 ◆服务在操作系统的后台(Background)为用户默默提供各种业务技能和系统 状态的监控业务。

Android实现获取系统应用列表

Android实现获取系统应用列表 本文介绍在Android中如何获取系统应用程序列表。 Android系统为我们提供了很多服务管理的类,包括ActivityManager、PowerManager(电源管理)、AudioManager(音频管理) 等。除此之外,还提供了一个PackageManger管理类,它的主要职责是管理应用程序包。通过它,我们就可以获取应用程序信息。 PackageManager的功能: ?安装,卸载应用 ?查询permission相关信息 ?查询Application相关信息(application,activity,receiver,service,provider及相应属性等)?查询已安装应用 ?增加,删除permission ?清除用户数据、缓存,代码段等 我们可以用PackageManager来显示系统安装的应用程序列表或者系统程序列表 相关类的介绍 PackageItemInfo类 说明:AndroidManifest.xml文件中所有节点的基类,提供了这些节点的基本信息:a label、icon、meta-data。它并不直接使用,而是由子类继承然后调用相应方法。 常用字段: public int icon 获得该资源图片在R文件中的值(对应于android:icon属性) public int labelRes 获得该label在R文件中的值(对应于android:label属性) public String name 获得该节点的name值(对应于android:name属性) public String packagename 获得该应用程序的包名(对应于android:packagename属性) 常用方法: Drawable loadIcon(PackageManager pm) 获得当前应用程序的图像 CharSequence loadLabel(PackageManager pm) 获得当前应用程序的label

Android服务Service 详解

第8章 Android服务 ? 8.1 Service起步? 8.1.1 Service的生命周期 ? 8.1.2 绑定Activity和Service ? 8.1.3 在BroadcastReceiver中启动Ser.. ? 8.2.1 获得系统服务? 8.2.2 在模拟器上模拟重力感应 ? 8.3.1 计时器:Chronometer ? 8.3.2 预约时间Handler ? 8.3.4 在线程中更新GUI组件? 8.3.5 全局定时器AlarmManager(1) ? 8.3.5 全局定时器AlarmManager(2)? 8.3.5 全局定时器AlarmManager(3) ? 8.4.1 什么是AIDL服务? 8.4.2 建立AIDL服务的步骤(1) ? 8.4.2 建立AIDL服务的步骤(2)? 8.4.2 建立AIDL服务的步骤(3) ? 8.5 本章小结 第8章Android服务 服务(Service)是Android系统中4个应用程序组件之一(其他的组件详见3.2节的内容)。服务主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。通过AIDL服务可以实现不同进程之间的通信,这也是服务的重要用途之一。 本章内容 Service的生命周期 绑定Activity和Service 在BroadcastReceiver中启动Service 系统服务 时间服务 在线程中更新GUI组件 AIDL服务 在AIDL服务中传递复杂的数据 8.1 Service起步 Service并没有实际界面,而是一直在Android系统的后台运行。一般使用Service为应用程序提供一些服务,或不需要界面的功能,例如,从Internet下载文件、控制Video播放器等。本节主要介绍Service的启动和结束过程(Service的生命周期)以及启动Service的各种方法。 8.1.1 Service的生命周期 本节的例子代码所在的工程目录是src\ch08\ch08_servicelifecycle Service与Activity一样,也有一个从启动到销毁的过程,但Service的这个过程比Activity简单得多。Service启动到销毁的过程只会经历如下3个阶段: 创建服务 开始服务 销毁服务

Android系统完整的启动过程

Android系统完整的启动过程,从系统层次角度可分为Linux系统层、Android系统服务层、Zygote进程模型三个阶段;从开机到启动Home Launcher完成具体的任务细节可分为七个步骤,下面就从具体的细节来解读Android系统完整的初始化过程。 一、启动BootLoader Android 系统是基于Linux操作系统的,所以它最初的启动过程和Linux一样。当设备通电后首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境引导进入合适的状态,以便为最终调用操作系统内核准备好正确的运行环境。 而Linux系统启动时: 1)首先要加载BIOS的硬件信息,并获取第一个启动设备的代号 2)读取第一个启动设备的MBR的引导加载程序(lilo、grub等)的启动信息。 3)加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有的硬件设备。 ………… 在嵌入式系统中,通常不会有像BIOS那样的固件程序,因此整个系统的加载任务都是通过BootLoader完成的。 二、加载系统内核 Linux内核映像通常包括两部分代码,分别为实模式代码和保护模式代码。当BootLoader装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行完成后转入保护模式代码。 实模式和保护模式的概念再次不做过多解释,读者可以自行查阅资料。 三、启动Init进程 当系统内核加载完成之后,会首先启动Init守护进程,它是内核启动的第一个用户级进程,它的进程号总是1。Init进程启动完成之后,还负责启动其他的一些重要守护进程,包括: Usbd进程(USB Daemon):USB连接后台进程,负责管理USB连接。 adbd 进程(Android Debug Bridge Daemon):ADB连接后台进程,负责管理ADB连接。 debuggerd 进程(Debugger Daemon) :调试器后台进程,负责管理调试请求及调试过程。 rild进程(Radio Interface Layer Daemon):无线接口层后台进程,负责管理无线通信服务。 四、启动Zygote进程 Init进程和一些重要的守护进程启动完成之后,系统启动Zygote 进程。Zygote 进程启动后,首先初始化一个Dalvik VM实例,然后为它加载资源与系统共享库,并开启Socket监听服务,当收到创建Dalvik VM实例请求时,会通过COW(copy on write)技术最大程度地复用自己,生成一个新的Dalvik VM实例。Dalvik VM实例的创建方法基于linux系统的fork原理。

Android 4.0.3系统软件精简列表

Android 4.0自带软件精简列表!! 相信很多机友都需要吧,删除一些没用的软件,节省出一定的内存空间,可以使系统更加流畅。 AccountAndSyncSettings.apk 搜索应用提供商(不建议删,如果不用同步则可删. 不用谷歌的同步功能就可以删除 BackupRestoreConfirmation.apk (不能删) Bluetooth.apk 蓝牙 (不能删,你懂的) BooksTablet.apk 谷歌读书软件(可删,没用的看书软件,可用GGbook或者其他代替,没啥用,我删了) Browser Google.apk 自带浏览器(可删,没啥用,我删了,反正我用UC浏览器) Calculator.apk 计算器(可删,鸡肋的计算器,可用其他多功能计算器代替,没啥用,我删了) CalendarGoogle.apk 日历(可删,鸡肋的日历,我删了,加个中华万年历)CalendarProvider.apk 日历储存(可删,上面删了这个也要删) CameraGoogle.apk 相机(不能删,系统自带的好过其他软件,我已经对比过很多照相软件都没自带的好.原生的强大啊!)QQ178505928 CarHomeGoogle.apk 车载模式(可删,没啥用,我删了) CertInstaller.apk 证书(不能删) ChromeBookmarksSyncAdapter.apk 书签同步(可删,没啥用,我删了) ContactsProvider.apk 联系人储存(不建议删,如果用QQ通讯录可直接删掉) Contacts.apk 通讯录(不建议删,自带通讯录) DefaultContainerService.apk 软件包访问(不能删,删了不能安装软件了) DeskClockGoogle.apk 时钟(可删,可用整点闹钟代替,没啥用,我删了) DownloadProviderUi.apk.下载提供UI(可删,没啥用,我删了) DownloadProvider.apk..下载提供(可删,那个下载内容,没啥用,我删了)DrmProvider.apk......DRM 受保护数据存储服务(不能删) EmailGoogle.apk 电子邮件(可删,没用手机看邮件的可删,可用其他代替) ExchangeGoogle.apk 电子邮件服务(可删,上面删了,这也删) GalleryGoogle.apk 图库(不建议删,自带的也挺好.) GenieWidget.apk新闻与天气(可删,没用的东西)

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务 Service简介 Service是Android中实现程序后台运行的解决方案,它非常适用于去执行那些不需要和用户交互而且还要求长期运行的任务。Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作 Service的运行不依赖于任何用户界面,即使程序被切换到后台或者用户打开另一个应用程序,Service仍然能够保持正常运行,这也正是Service的使用场景。当某个应用程序进程被杀掉时,所有依赖于该进程的Service也会停止运行 后台服务 后台服务可交互性主要是体现在不同的启动服务方式,startService()和bindService()。bindService()可以返回一个代理对象,可调用Service中的方法和获取返回结果等操作,而startService()不行 不可交互的后台服务 不可交互的后台服务即是普通的Service,Service的生命周期很简单,分别为onCreate、onStartCommand、onDestroy这三个。当我们startService()的时候,首次创建Service会回调onCreate()方法,然后回调onStartCommand()方法,再次startService()的时候,就只会执行一次onStartCommand()。服务一旦开启后,我们就需要通过stopService()方法或者stopSelf()方法,就能把服务关闭,这时就会回调onDestroy() 一、创建服务类 创建一个服务非常简单,只要继承Service,并实现onBind()方法 public class BackGroupService extends Service { /** * 綁定服务时调用 * * @param intent * @return */ @Nullable

android安卓系统自带软件列表(想精简系统软件的看

defy系统自带软件列表(想精简系统软件的看) 带*标志是不可删除(删除了只有刷机了) *AccountAndSyncSettings.apk 同步与帐户设定 *ApplicationsProvider.apk 应用程序支持服务 Bluetooth.apk 蓝牙(删了就没有蓝牙了) Browser.apk 谷歌浏览器(喜欢UC的可用UC替代) Calculator.apk 计算器(自带计算器较弱,可用其他替代)Calendar.apk 日历(不用日历的可删) CalendarProvider.apk 日历程序支持服务(不用日历的可删) *Camera.apk 自带相机(用360的可删) *CertInstaller.apk 证书服务 Contacts.apk 通讯录/联系人(用第三方通讯录的可删) *ContactsProvider.apk 通讯录/联系人数据存储服务 *DefaultContainerService.apk 默认通讯录服务 DeskClock.apk 自带闹钟(用第三方闹钟的可删) *DownloadProvider.apk 下载管理器 *DrmProvider.apk DRM受保护数据存储服务 DSPManager.apk DSP音频管理(可删) Email.apk Email(不用自带email接受邮件的可删)FileManager.apk 简易文件管理器(用ES替代了,这个不用,删之)Gallery3D.apk 3D浏览器(嫌弃它速度慢的,可删)GenieWidget.apk 天气与新闻(看新闻的,不要的话可删) Gmail.apk Gmail(可删,不用GMAIL的就删了吧)

Android系统在新进程中启动自定义服务过程(startService)的原理分析

Android系统在新进程中启动自定义服务过程(startService)的原理分析 在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验。Android系统为我们提供了一个Service类,我们可以实现一个以Service为基类的服务子类,在里面实现自己的计算型逻辑,然后在主进程通过startService函数来启动这个服务。在本文中,将详细分析主进程是如何通过startService函数来在新进程中启动自定义服务的。 在主进程调用startService函数时,会通过Binder进程间通信机制来通知ActivitManagerService来创建新进程,并且启动指定的服务。在Android系统中,Binder进程间通信机制使用非常广泛,因此,希望读者在继续阅读下面的内容之前,对Android系统和Binder 进程间通信机制有一定的了解,具体可以参考前面Android进程间通信(IPC)机制Binder简要介绍和学习计划一文。 关于startService的具体用法,可以参考前面Android系统匿名共享内存Ashmem (Anonymous Shared Memory)简要介绍和学习计划一文中用到的实例,它是Activity类的一个成员函数: view plain 1package shy.luo.ashmem; 2 3...... 4 5public class Client extends Activity implements OnClickListener { 6 ...... 7 IMemoryService memoryService = null; 8 ...... 9 10 @Override 11public void onCreate(Bundle savedInstanceState) { 12 ...... 13 14 IMemoryService ms = getMemoryService(); 15if(ms == null) { 16 startService(new Intent("shy.luo.ashmem.server")); 17 } else { 18 Log.i(LOG_TAG, "Memory Service has started."); 19 } 20 21 ...... 22 23 Log.i(LOG_TAG, "Client Activity Created."); 24 }

Android的前台服务

Android的前台服务 Service几乎都是在后台运行的,一直以来它都是默默地做着辛苦的工作。但是Service的系统优先级还是比较低的,当系统出现内存不足情况时,就有可能会回收掉正在后台运行的Service。如果你希望Service可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收,就可以考虑使用前台Service。 前台Service和普通Service最大的区别就在于,它会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果。当然有时候你也可能不仅仅是为了防止Service被回收才使用前台Service,有些项目由于特殊的需求会要求必须使用前台Service,比如说墨迹天气,它的Service在后台更新天气数据的同时,还会在系统状态栏一直显示当前天气的信息,如下图所示:

那么我们就来看一下如何才能创建一个前台Service吧,其实并不复杂,如下所示: 这里只是修改了Service中onCreate()方法的代码。可以看到,我们首先创建了一个Notification对象,然后调用了它的setLatestEventInfo()方法来为通知初始化布局和数据,并在这里设置了点击通知后就打开MainActivity。然后调用startForeground()方法就可以让MyService变成一个前台Service,并会将通知的图片显示出来。喜欢Android的朋友可以来南京宝云官网交流噢! 现在重新运行一下程序,Service就会以前台Service的模式启动了,并且在系统状态栏会弹出一个通栏图标,下拉状态栏后可以看到通知的详细内容,如下图所示:

相关主题
文本预览
相关文档 最新文档