Android组件之Service浅谈

简介:

Service是Android中的四大组件之一,和windows中的服务是类似,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序Service,手机中有的程序的更新,服务的推送。Android系统中,Service与Activity类似,都需要AndroidManifest.xml文件中配置,而且生命周期有点类似。Service不像Activity在前台运行,而是默默的在后台默默的工作,简单粗暴点理解就是男主内女主外,分工明确。

Service生命周期

service与activity一样都存在与当前进程的主线程中,所以,一些阻塞UI的操作,比如耗时操作不能放在service里进行,比如另外开启一个线程来处理类似下载这种耗时操作。如果在service里进行一些耗CPU和耗时操作,应用会弹出是强制关闭还是等待的对话框。因此service和activity是平级的,四大组件之一的地位也不是浪得虚名。先看张经典老图:

 

这两个都是Service的生命周期,从上到到下也没有什么难懂的英文,应该比较好理解,如果有困惑,可以先参考下面的程序就懂了.

两种启动Service方式

自定义一个BookService继承自Service:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public  class  BookService  extends  Service  {
 
     private  String tag= "BookService" ;
 
     @Override
     public  void  onCreate() {
         // TODO Auto-generated method stub
         super .onCreate();
         Log.i(tag,  "开始onCreate启动了" );
     }
 
     @Override
     public  int  onStartCommand(Intent intent,  int  flags,  int  startId) {
         // TODO Auto-generated method stub
         Log.i(tag,  "开始执行onStartCommand启动了" );
         Toast.makeText( this "BookService开始了" ,Toast.LENGTH_SHORT).show();
         return  super .onStartCommand(intent, flags, startId);
         
     }
 
     @Override
     public  void  onDestroy() {
         // TODO Auto-generated method stub
         Log.i(tag,  "销毁onDestroy启动了" );
         super .onDestroy();
     }
 
     @Override
     public  IBinder onBind(Intent intent) {
         // TODO Auto-generated method stub
         Log.i(tag,  "绑定onBind启动了" );
         return  null ;
     }
     @Override
     public  boolean  onUnbind(Intent intent) {
         // TODO Auto-generated method stub
         Log.i(tag,  "解绑onUnbind启动了" );
         return  super .onUnbind(intent);
     }
 
}

 

  看下效果图:

 

布局很简单,就不贴代码了,但是需要在AndroidManifest.xml注册一下代码:

1
<service android:name= "com.example.googleservice.BookService" ></service>

点击第一个按钮执行的代码,Intent之前有写过,之前是startActivity,这里用的startService:

 

1
2
Intent service= new  Intent( this ,BookService. class );
         startService(service);

 

  第二个按钮执行的事件:

1
2
Intent stopservice= new  Intent( this ,BookService. class );
             stopService(stopservice);

  通过Log就很容易明白第一张图了,第一种调用Service的方式也就简单完成了;

 

第二种调用首先定义个继承自ServiceConnection的BookConnection:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class  BookServiceConnection  implements  ServiceConnection{
 
      public  BookServiceConnection() {
          super ();
          // TODO Auto-generated constructor stub
      }
 
      @Override
      public  void  onServiceConnected(ComponentName name, IBinder service) {
          // TODO Auto-generated method stub
      }
 
      @Override
      public  void  onServiceDisconnected(ComponentName name) {
          // TODO Auto-generated method stub
          
      }
      
  }

 第三个按钮触发的代码:

1
2
3
Intent binderStartIntent= new  Intent( this ,BookService. class );
              connection= new  BookServiceConnection();
             bindService(binderStartIntent, connection,Context.BIND_AUTO_CREATE);

  第四种按钮触发的事件:

1
unbindService(connection);

  看下Log对比之后也就明白了第二张图:

这两种都很简单,不过有的时候Activity和Service之间是要通信的:

这个时候你可以在BookService中定义一个内部类:

 

1
2
3
4
5
class  BookBinder  extends  Binder {
     public  BookService getCurrentService() {
         return  BookService. this ;
     }
}

 

 这个时候在Activity中的BookServiceConnection中onServicedConnected中改动一下:

1
2
3
4
5
6
7
@Override
     public  void  onServiceConnected(ComponentName name, IBinder service) {
         // TODO Auto-generated method stub
         //获取实例
         BookService  bookService=((BookService.BookBinder)service).getCurrentService();
         //just  do  wo  you  want to do
     }

 Service一直在后台工作,可以通过Notification将消息传递到前台,修改一下BookService的onCreate()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public  void  onCreate() {
     // TODO Auto-generated method stub
     super .onCreate();
      NotificationManager mNotificationManager = (NotificationManager)
      getSystemService(NOTIFICATION_SERVICE);
      NotificationCompat.Builder mBuilder =
      new  NotificationCompat.Builder( this )
      .setSmallIcon(R.drawable.ic_launcher)
      .setContentTitle( "QQ空间" )
      .setContentText( "北京真坑,开个会房子都被拆" );
     
      mNotificationManager.notify( 0 , mBuilder.build());
     Log.i(tag,  "开始onCreate启动了" );
}

  通知栏如下:

 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4077587.html,如需转载请自行联系原作者

相关文章
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
132 0
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
61 6
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
347 5
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
安卓开发中的自定义View组件实践
【8月更文挑战第30天】探索Android世界,自定义View是提升应用界面的关键。本文以简洁的语言带你了解如何创建自定义View,从基础到高级技巧,一步步打造个性化的UI组件。