http://blog.csdn.net/guolin_blog/article/details/11952435

http://www.jianshu.com/p/eeb2bd59853f

  • 概述

定义、特点:

Service是可以在后台执行长时间(长生命周期)而又不与用户产生UI交互(没有用户界面)的操作

注意事项:
1、只能在后台运行,即便用户切换了其他应用,启动的Service仍可在后台运行。
2、可以和其他组件进行Service绑定并与之交互,甚至是跨进程通信(IPC)。
3、不能运行在一个独立的进程当中,而是依赖与创建服务时所在的应用组件进程。
4、服务不会自动开启线程,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务。

应用场景举例:
音乐播放:播放多媒体的时候用户启动了其他Activity,此时要在后台继续播放。
记录检测:比如检测SD卡上文件的变化;在后台记录你的地理信息位置的改变等。
其他操作:网络请求、执行文件读写操作或者与 content provider交互。

类型:
本地服务与远程服务

本地服务依附在主进程上,在一定程度上节约了资源。本地服务因为是在同一进程,因此不需要IPC,也不需要AIDL。相应bindService会方便很多。缺点是主进程被kill后,服务变会终止。

远程服务是独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被kill的是偶,该服务依然在运行。缺点是该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。本文第六部分将会简单的讲述这一进程间通信方式。

对于startService来说,不管是本地服务还是远程服务,我们需要做的工作都一样简单。

生命周期

  • 用法

然后新建一个MyService继承自Service,并重写父类的onCreate()、onStartCommand()和onDestroy()方法,如下所示:

  1. public class MyService extends Service {
  2.  
  3. public static final String TAG = "MyService";
  4.  
  5. @Override
  6. public void onCreate() {
  7. super.onCreate();
  8. Log.d(TAG, "onCreate() executed");
  9. }
  10.  
  11. @Override
  12. public int onStartCommand(Intent intent, int flags, int startId) {
  13. Log.d(TAG, "onStartCommand() executed");
  14. return super.onStartCommand(intent, flags, startId);
  15. }
  16.  
  17. @Override
  18. public void onDestroy() {
  19. super.onDestroy();
  20. Log.d(TAG, "onDestroy() executed");
  21. }
  22.  
  23. @Override
  24. public IBinder onBind(Intent intent) {
  25. return null;
  26. }
  27.  
  28. }

在Activity里面加入启动Service和停止Service的逻辑

  1. public void onClick(View v) {
  2. switch (v.getId()) {
  3. case R.id.start_service:
  4. Intent startIntent = new Intent(this, MyService.class);
  5. startService(startIntent);
  6. break;
  7. case R.id.stop_service:
  8. Intent stopIntent = new Intent(this, MyService.class);
  9. stopService(stopIntent);
  10. break;
  11. default:
  12. break;
  13. }
  14. }

另外需要注意,项目中的每一个Service都必须在AndroidManifest.xml中注册才行

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.servicetest"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="14"
  9. android:targetSdkVersion="17" />
  10.  
  11. <application
  12. android:allowBackup="true"
  13. android:icon="@drawable/ic_launcher"
  14. android:label="@string/app_name"
  15. android:theme="@style/AppTheme" >
  16.  
  17. ……
  18.  
  19. <service android:name="com.example.servicetest.MyService" >
  20. </service>
  21. </application>
  22.  
  23. </manifest>

通过startService方式(继承Service类) 总结
1、启动服务对象多次启动同时只会产生一个,onCreate()方法只会在Service第一次被创建的时候调用,多次点击启动会执行多次onStartCommand()方法,onDestroy()方法只会在Service第一次被停止的时候调用,多次点击停止不会报异常,也不再执行onDestroy()方法。

2、一旦启动,Service将一直运行在后台(run in the background indefinitely)即便启动Service的组件已被destroy。

3、停止一个started服务有两种方法:
(1)在外部使用stopService()手动停止。
(2)在服务内部(onStartCommand方法内部)使用stopSelf()方法,使服务执行完毕后自动停止。比如说,一个start的Service执行在后台下载或上传一个文件的操作,完成之后,Service应自己停止。

4、onStartCommand方法的返回值:
onStartCommand方法执行时,返回的是一个int型。这个整型可以有三个返回值:START_NOT_STICKY、START_STICKY、START_REDELIVER_INTENT
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand方法后,服务被异常kill掉,系统不会自动重启该服务。
START_STICKY:如果Service进程被kill掉,保留Service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建Service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到Service,那么参数Intent将为null。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,系统会自动重启该服务,并将Intent的值传入。

5、默认情况下,一个started的Service与启动他的组件在同一个线程中。上面的实例中,服务就是在主线程中运行的,如果是在服务中完成耗时操作的话,容易造成主线程阻塞。所以我们可以在服务中开启一个子线程来完成耗时操作。

  1. public class MyService extends Service {
  2. public static final String TAG = "MyService";
  3. //服务执行的操作
  4. @Override
  5. public int onStartCommand(Intent intent, int flags, int startId) {
  6. new Thread(new Runnable() {
  7. public void run() {
  8. //在子线程中处理具体的逻辑
  9. //在这里我们只做打印子线程id的操作
  10. Log.i("MyService",Thread.currentThread().getId()+"");
  11. stopSelf(); //服务执行完毕后自动停止
  12. }
  13. }).start();
  14. return super.onStartCommand(intent, flags, startId);
  15. }
  16.  
  17. @Override
  18. public IBinder onBind(Intent intent) {
  19. // TODO Auto-generated method stub
  20. return null;
  21. }
  22. }

如果我们不手动开启线程,I/MyService: 177将会变成它依赖的主线程1,这就不能做耗时操作了。虽说上面的这种写法并不复杂,但总会有一些程序猿忘记开启线程,或者忘记调用stopSelf()方法。
为了可以简单地创建一个可开启单独线程、会自动停止的服务,Android专门提供了一个IntentService类,这个类就很好的解决了上面所提到的两种尴尬。

IntentService类

IntentService的作用:
当我们需要这样一次性完成的任务时,就可以使用IntentService来完成。

IntentService的用法:

1)新建一个MyIntentService类,继承自IntentService,并重写父类的onHandleIntent()方法,代码如下:

  1. public class MyIntentService extends IntentService{
  2. public MyIntentService() {
  3. //第一步:重写父类的onHandleIntent()方法,这里首先要提供一个无参的构造方法,
  4. //并且必须在其内部调用父类的有参构造方法,这里我们手动给服务起个名字为:MyIntentService
  5. super("MyIntentService");
  6. }
  7.  
  8. //第二步:重写父类的onHandleIntent()方法,该方法在会在一个单独的线程中执行,
  9. //来完成工作任务。任务结束后,该Service自动停止
  10. @Override
  11. protected void onHandleIntent(Intent intent) {
  12. for(int i = 0;i<3;i++) {
  13. //Service要执行的逻辑
  14. //这里我们只打印当前线程的id
  15. Log.d("MyIntentService","IntentService线程的id是:"+Thread.currentThread().getId());
  16. try {
  17. //线程睡眠一秒钟
  18. Thread.sleep(1000);
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }
  24.  
  25. @Override
  26. public void onDestroy() {
  27. super.onDestroy();
  28. Log.d("MyIntentService","onDestroy");
  29. }
  30. }

通过startService方式(继承IntentService类) 总结
1、启动一个IntentService和启动一个普通的Service,步骤是相似的。
2、与直接继承Service不同在于:通过继承IntentService运行,自动开启了单独线程,而且完成任务后自动销毁了Service。

【补充】Service和Thread的关系:
不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Thread之间没有任何关系!
之所以有不少人会把它们联系起来,主要就是因为Service的后台概念。Android的后台就是指,它的运行是完全不依赖UI的。即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行。而Service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里运行,这就会让人产生混淆了。但是,Service其实是运行在主线程里的,一些比较耗时的操作需要开启单独线程

通过bindService方式定义一个Service:(使用Bind Service完成Service和Activity之间的通信):

Bind Service的引入:

有没有什么办法能让Service与组件的关联更多一些呢?比如说在Activity中指挥Service去干什么,Service就去干什么。当然可以,只需要让Activity和Service建立关联就好了。这时我们就可以通过bindService方式定义一个Service。

Bind Service的实现原理:

应用程序组件(客户端)通过调用bindService()方法能够绑定服务,然后Android系统会调用服务的onBind()回调方法,则个方法会返回一个跟服务器端交互的Binder对象。

bindService()方法立即返回,并且不给客户端返回IBinder对象。要接收IBinder对象,客户端必须创建一个ServiceConnection类的实例,并且把这个实例传递给bindService()方法。ServiceConnection对象包含了一个系统调用的传递IBinder对象的回调方法。

Bind Service实现流程:

1)一直有一个onBind()方法我们都没有使用到,这个方法其实就是用于和Activity建立关联的,修改MyService中的代码,如下所示:

  1. public class MyBindService01 extends Service {
  2. public static final String TAG = "MyBindService01";
  3. private MyBinder mBinder = new MyBinder();
  4. @Override
  5. public void onCreate() {
  6. super.onCreate();
  7. Log.d(TAG, "onCreate");
  8. }
  9.  
  10. @Override
  11. public IBinder onBind(Intent intent) {
  12. return mBinder; //在这里返回新建的MyBinder类
  13. }
  14.  
  15. @Override
  16. public boolean onUnbind(Intent intent) {
  17. Log.d(TAG, "onUnbind");
  18. return super.onUnbind(intent);
  19. }
  20.  
  21. @Override
  22. public int onStartCommand(Intent intent, int flags, int startId) {
  23. Log.d(TAG, "onStartCommand");
  24. return super.onStartCommand(intent, flags, startId);
  25. }
  26.  
  27. @Override
  28. public void onDestroy() {
  29. super.onDestroy();
  30. Log.d(TAG, "onDestroy");
  31. }
  32.  
  33. //MyBinder类,继承Binder:让里面的方法执行下载任务,并获取下载进度
  34. class MyBinder extends Binder {
  35. public void startDownload() {
  36. Log.d("TAG", "startDownload() executed");
  37. // 执行具体的下载任务
  38. }
  39. public int getProgress(){
  40. Log.d("TAG", "getProgress() executed");
  41. return 0;
  42. }
  43. }
  44. }
  • 新建一个MyBinder类,继承Binder:让里面的方法执行下载任务,并获取下载进度。当然,这里只是两个模拟方法,并没有实现真正的功能,我们通过打印日志的形式来体现。
  • 接着创建MyBinder的实例,然后在onBind()方法里返回这个实例。返回这个mBinder,是一个IBinder类型,就可以把这个IBinder类型传递到MainActivity中,从而调用Service里面的方法。

2)检查清单文件,是否已经对Service进行注册:
<service android:name=".MyBindService01" ></service>
3)让我们修改MainActivity和MyBindService01之间建立关联

  1. public class MainActivity extends Activity implements OnClickListener {
  2. private Button button1_bind_service;
  3. private Button button2_unbind_service;
  4. private MyBindService01.MyBinder myBinder;
  5.  
  6. boolean mBound = false; //一开始,并没有和Service绑定.这个参数是用来显示绑定状态
  7.  
  8. //匿名内部类:服务连接对象
  9. private ServiceConnection connection = new ServiceConnection() {
  10.  
  11. //当服务异常终止时会调用。注意,解除绑定服务时不会调用
  12. @Override
  13. public void onServiceDisconnected(ComponentName name) {
  14. mBound = false; //服务异常终止时,状态为未绑定
  15. //解决了多次执行unbindService()方法引发的异常问题
  16. }
  17.  
  18. //和服务绑定成功后,服务会回调该方法
  19. @Override
  20. public void onServiceConnected(ComponentName name, IBinder service) {
  21. myBinder = (MyBindService01.MyBinder) service;
  22. //在Activity中调用Service里面的方法
  23. myBinder.startDownload();
  24. myBinder.getProgress();
  25. mBound = true; //true说明是绑定状态
  26. }
  27. };
  28. @Override
  29. protected void onCreate(Bundle savedInstanceState) {
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.activity_main);
  32. button1_bind_service = (Button) findViewById(R.id.button1_bind_service);
  33. button2_unbind_service = (Button) findViewById(R.id.button2_unbind_service);
  34. button1_bind_service.setOnClickListener(this);
  35. button2_unbind_service.setOnClickListener(this);
  36. }
  37. @Override
  38. public void onClick(View v) {
  39. switch (v.getId()) {
  40. case R.id.button1_bind_service:
  41. Intent bindIntent = new Intent(this, MyService.class);
  42. bindService(bindIntent, connection, BIND_AUTO_CREATE);
  43. //这里传入BIND_AUTO_CREATE表示在Activity和Service建立关联后会自动创建Service(即使之前没有创建
  44. //Service也没有关系),这会使得MyService中的onCreate()方法得到执行,但onStartCommand()方法不会执行。
  45. break;
  46. case R.id.button2_unbind_service:
  47. //如果和Service是绑定的状态,就解除绑定。
  48. if(mBound){
  49. unbindService(connection);
  50. mBound=false;
  51. }
  52. break;
  53. default:
  54. break;
  55. }
  56. }
  57. }

说明:这里我们首先创建了一个ServiceConnection的匿名类,在里面重写了onServiceConnected()方法和onServiceDisconnected()方法,如果当前Activity与服务连接成功后,服务会回调onServiceConnected()方法
在onServiceConnected()方法中,我们又通过向下转型得到了MyBinder的实例,有了这个实例,Activity和Service之间的关系就变得非常紧密了。现在我们可以在Activity中根据具体的场景来调用MyBinder中的任何public方法,即实现了Activity指挥Service干什么Service就去干什么的功能。

当然,现在Activity和Service其实还没关联起来了呢,这个功能是在Bind Service按钮的点击事件里完成的。可以看到,这里我们仍然是构建出了一个Intent对象,然后调用bindService()方法将Activity和Service进行绑定。bindService()方法接收三个参数,第一个参数就是刚刚构建出的Intent对象,第二个参数是前面创建出的ServiceConnection的实例,第三个参数是一个标志位,这里传入BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service,这会使得MyService中的onCreate()方法得到执行,但onStartCommand()方法不会执行。

通过bindService方式 总结
1、onCreate()、onBind()方法只会在Service第一次被创建的时候调用,多次点击绑定启动不会执行任何方法,onUnbind()、onDestroy()方法会在调用者执行unbindService()方法时执行或者Activity退出时自动执行。

2、如果我们既通过startService()开启Service,又用通过bindService开启,必要unbindService()和stopService()都执行一次(没有先后顺序),Service才会被销毁。

3、如果多次执行unbinsService()方法,程序会异常退出,我们需要在代码中加一个判断是否绑定的标记mBound来解决此问题,上面代码中有说明。

  1. case R.id.button4_unbind_service:
  2. //如果和Service是绑定的状态,就解除绑定。
  3. if(mBound){
  4. unbindService(connection);
  5. mBound=false;
  6. }
  7. break;

4、当在旋转手机屏幕的时候,当手机屏幕在“横”“竖”变换时,此时如果你的 Activity 如果会自动旋转的话,旋转其实是 Activity 的重新创建,因此旋转之前的使用 bindService 建立的连接便会断开(Context 不存在了)。

5、只有Activity、Service、Content Provider能够绑定服务;BroadcastReceiver广播接收器不能绑定服务。

、bindService和startService混合使用:

  • 如果先startService,再bindService:
    在bind的Activity退出的时候,Service会执行unBind方法而不执行其onDestory方法,因为有startService方法调用过,
    所以Activity与Service解除绑定后会有一个与调用者没有关连的Service存在。
  • 如果先bindService,再startService,再调用Context.stopService
    Service的onDestory方法不会立刻执行,因为有一个与Service绑定的Activity,但是在Activity退出的时候,会执行其(Service的)onDestory方法,如果要立刻执行stopService,就得先解除绑定。

  • 如果先是bind了,那么start的时候就直接运行Service的onStartCommand()方法,如果先是start,那么bind的时候就直接运行onBind()方法。

  • 当一个服务没被onDestory()销毁之前,只有第一个启动它的客户端能调用它的onBind()和onUnbind()。

四、startService、bindService区别大总结

1、生命周期不同。(详见图)
2、多次启动,前者会多次执行onStartCommand()方法,后者什么都不执行。多次停止,前者只会执行一次onDestroy()方法,后者报异常信息。
3、当启动Service的组件已被Destroy的时候,前者不停止,后者会停止。
4、前者停止直接执行onDestroy()方法(Service中的),后者则先解除绑onUnbind()定再执行onDestroy()方法(Service中的)。
5、当手机屏幕在“横”“竖”变换时,前者创建的Service不会停止,后者会随着Activity的重建而停止。
6、后者的onBind回调方法将返回给客户端一个IBinder接口实例,IBinder允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。而这些操作前者启动的Service是没有的。

五、在AndroidManifest.xml里Service元素常见选项

  1. android:name -- 服务类名
  2. android:label -- 服务的名字,如果此项不设置,那么默认显示的服务名则为类名
  3. android:icon -- 服务的图标
  4. android:permission -- 申明此服务的权限,这意味着只有提供了该权限的应用才能控制或连接此服务
  5. android:process -- 表示该服务是否运行在另外一个进程,如果设置了此项,那么将会在包名后面加上这段字符串表示另一进程的名字
  6. android:enabled --表示是否能被系统实例化,为true表示可以,为false表示不可以,默认为true
  7. android:exported -- 表示该服务是否能够被其他应用程序所控制或连接,不设置默认此项为 false

创建前台Service

 

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

那么我们就来看一下如何才能创建一个前台Service吧,其实并不复杂,修改MyService中的代码,如下所示:

  1. public class MyService extends Service {
  2.  
  3. public static final String TAG = "MyService";
  4.  
  5. private MyBinder mBinder = new MyBinder();
  6.  
  7. @Override
  8. public void onCreate() {
  9. super.onCreate();
  10. Notification notification = new Notification(R.drawable.ic_launcher,
  11. "有通知到来", System.currentTimeMillis());
  12. Intent notificationIntent = new Intent(this, MainActivity.class);
  13. PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
  14. notificationIntent, 0);
  15. notification.setLatestEventInfo(this, "这是通知的标题", "这是通知的内容",
  16. pendingIntent);
  17. startForeground(1, notification);
  18. Log.d(TAG, "onCreate() executed");
  19. }
  20.  
  21. .........
  22.  
  23. }

这里只是修改了MyService中onCreate()方法的代码。可以看到,我们首先创建了一个Notification对象,然后调用了它的setLatestEventInfo()方法来为通知初始化布局和数据,并在这里设置了点击通知后就打开MainActivity。然后调用startForeground()方法就可以让MyService变成一个前台Service,并会将通知的图片显示出来。

现在重新运行一下程序,并点击Start Service或Bind Service按钮,MyService就会以前台Service的模式启动了,并且在系统状态栏会弹出一个通栏图标,下拉状态栏后可以看到通知的详细内容

  1.  

Android四大组件-Service的更多相关文章

  1. Android四大组件——Service

    Service相关链接 Service初涉 Service进阶 Service精通 Service是Android系统中的一种组件,它跟Activity的级别差不多,但是它不能自己运行,只能后台运行, ...

  2. Android 四大组件 Service 服务

    1.Service简单介绍 依照使用范围分类: 类别 优点 缺点 差别 应用 本地服务 Local  Service 本地服务在一定程度上节约了资源,另外本地服务由于是在同一进程,因此不须要IPC,也 ...

  3. Android 四大组件之再论service

    service常见的有2种方式,本地service以及remote service. 这2种的生命周期,同activity的通信方式等,都不相同. 关于这2种service如何使用,这里不做介绍,只是 ...

  4. Android成长日记-Android四大组件之Service组件的学习

    1.什么是Service? Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,它 ...

  5. Android四大组件之Service

    Android四大组件之Service Android支持服务的概念,服务是在后台运行的组件,没有用户界面,Android服务可用有与活动独立的生命周期.Android支持两种类型的服务: 本地服务: ...

  6. Android 四大组件之service与Broadcast

    Android 四大组件之一:service: Service有五个生命周期:onCreat,onStartCommand, onBind,onUnbind, onDestroy 主要有绑定和非绑定两 ...

  7. Android四大组件之一Service介绍-android学习之旅(十二)

    基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService ...

  8. Android四大组件之一 -- Service详解

    相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序 ...

  9. 【Android开发日记】之入门篇(五)——Android四大组件之Service

    这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的 ...

随机推荐

  1. Download SQL Server Management Studio (SSMS)下载地址

    Download SQL Server Management Studio (SSMS)下载地址: https://msdn.microsoft.com/en-us/library/mt238290. ...

  2. eclipse代码提示javadoc背景为黑色框的解决办法

    我的eclipse是近期下载的oxygen版本.不知道怎么出现了一个这个问题,鼠标悬停指向代码时应该出现的代码提示解释框,全为黑色,看不到文字.如下图 经过验证,最终解决方法为window->G ...

  3. SpringCloud实现集群和负载均衡

    Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的. 组成部分 spingcloud的五大神兽 服务发现——Netflix Eureka ...

  4. 30_网络编程-socketserver

    一.socketserver       socketserver可以实现和多个客户端通信.它是在socket的基础上进行了一层封装,也就是说底层还是调用的socket,在py2.7里面叫做Socke ...

  5. Akka(42): Http:身份验证 - authentication, authorization and use of raw headers

    当我们把Akka-http作为数据库数据交换工具时,数据是以Source[ROW,_]形式存放在Entity里的.很多时候除数据之外我们可能需要进行一些附加的信息传递如对数据的具体处理方式等.我们可以 ...

  6. 01-Python的基础知识3

    - 数字 - 数字常量: - 整型: - 概念: - 指代平常数学上的整数常量.Python中整型指代int类型. - 基本运算: - 可以执行平常的+,-,*,/ ,%以及其他操作 假设a=15,b ...

  7. [LeetCode] 两数相加

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  8. Windows平台下搭建自己的Git服务器

    该文章转自:http://www.codeceo.com/article/windows-git-server.html Gitblit 是一个纯 Java 库用来管理.查看和处理 Git 资料库,相 ...

  9. Node.js对MongoDB进行增删改查操作

    MongoDB简介 MongoDB是一个开源的.文档型的NoSQL数据库程序.MongoDB将数据存储在类似JSON的文档中,操作起来更灵活方便.NoSQL数据库中的文档(documents)对应于S ...

  10. es 修改拼音分词器源码实现汉字/拼音/简拼混合搜索时同音字不匹配

    [版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 在业务中经常会用到拼音匹配查询,大家都会用到拼音分词器,但是拼音分词器匹配的 ...