Android知识梳理之Service整理

          PS.不知不觉间发现自己已经做了很久很久的Android开发了,过去对知识块的梳理总是放在云笔记里面.主要的原因还是自己的笔记太杂乱,没有脉络.本着开源的精神,也趁着这段时间有空将之前云笔记里面的文章梳理下.同时将一些知识点整理出来和大家共同分享.

           转载请注明出处:http://blog.csdn.net/unreliable_narrator?viewmode=contents                                                                                        Android知识梳理之Service整理_第1张图片

           1.service就是就是一个没有界面的activity,同属于四大组件之一,使用的时候需要在清单文件中进行配置.service的主要作用就是在后台做一些比较耗时的操作.例如访问网络,后台播放,进行复杂计算等等.一般只要是满足于两个条件就可以使用service了,一是没有界面的交互,二是在后台长时间的运行.

           2.我们可以通过三种方式来开启服务.
             方式一 :直接通过 context.startservice() 方法来开启服务,这种方式开启的服务,服务会一直在后台运行,可以通过 context. stopservice()来将服务进行关闭.如果程序关闭的时候没有将service关闭,那么service还是会继续在后台进行默默的运行.也就是说这种方式开启的服务是和调用者没有任何关系的. 如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用 onStartCommand ()方法。            
    
    
    
    
startService(new Intent(MainActivity.this, MyService.class));
     
     
     
     
stopService(new Intent(MainActivity.this, MyService.class));  
     
     
     
     
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d("++", "MyService_onBind");
return null;
}
@Override
public boolean onUnbind(Intent intent) {
Log.d("++", "MyService_onUnbind");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.d("++", "MyService_onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("++", "MyService_onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("++", "MyService_onDestroy");
}
}
              方式二 通过 Context.bindService() 方法来开启服务.许多的时候我们不但要将服务开启还要调用服务里面的方法,这时候我们就需要使用绑定服务的方式来开启服务了.通过绑定方式开启的服务如果服务的调用者被关闭了,那么服务也会被关闭.需要注意的是 任何一个Service在整个应用程序范围内都是通用的,即MyService不仅可以和MainActivity建立关联,还可以和任何一个Activity建立关联,而且在建立关联时它们都可以获取到相同的MyBinder实例。      
   
   
   
   
public class MainActivity extends AppCompatActivity {
private ServiceConnection serviceConnection;
private MyService.MyBinder mMyBinder;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMyBinder = (MyService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
findViewById(R.id.btnOne).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//绑定开启服务
Intent intent = new Intent(MainActivity.this, MyService.class);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}
});
findViewById(R.id.btnTwo).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用服务里面的方法
mMyBinder.doBinder();
}
});
}
}
   
   
   
   
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
MyBinder myBinder = new MyBinder();
Log.d("++", "MyService_onBind");
return myBinder;
}
@Override
public boolean onUnbind(Intent intent) {
Log.d("++", "MyService_onUnbind");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.d("++", "MyService_onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("++", "MyService_onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("++", "MyService_onDestroy");
}
/*binder对象
* */
public class MyBinder extends Binder {
public void doBinder() {
doSMinServices();
}
}
/*
* 服务里面的方法
* */
public void doSMinServices() {
Toast.makeText(MyService.this, "我是服务中的方法,我被调用了", Toast.LENGTH_SHORT).show();
}
}
               绑定服务和普通服务之间的区别:
           (1.)绑定服务是和他的调用者的生命周期相关的,也就是说当调用者被销毁的时候,绑定服务也会同时被销毁.
              普通服务的生命周期和他的调用者是没有关系的,也就是说当调用者被关闭的时候服务仍旧是会在后台进行.而不会被销毁.
           (2.)绑定服务是在任务管理器里面不可以看到的.
               普通服务是可以在任务管理器里面看到的.
           (3.)开启普通服务的调用者是没有办法调用服务里面的相关的方法的.
               通过绑定服务就可以直接调用服务中的方法.
        方式三:混合开启服务.混合开启服务就是先采 context.startservice()的方式开启服务,然后通过 Context.bindService()来对服务进行绑定,这样就兼具了两样开启服务的优势.
        二. 提高服务的优先级:
                              方式一:使用notification来使得服务的的优先级扩大.在服务的oncreate()或者是onstartcommed()方法里面调用开启服务.
    
    
    
    
@Override
public void onCreate() {
super.onCreate();
//创建通知对象
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentText("测试代码");
builder.setSmallIcon(R.drawable.biaoqin);
Notification build = builder.build();
//调用此方法将通知和服务绑定在一起
startForeground(1, build);
}
              方式二:在清单文件里面通过对服务的属性进行设置来提高服务的优先级.
      
      
      
      
 
<!-- 为了消去加上android:priority="1000"后出现的警告信息,可以设置android:exported属性,指示该服务是否能够被其他应用程序组件调用或跟它交互 -->
<serviceandroid:name="com.example.helloandroid.weatherforecast.service.UpdateWidgetService"android:exported="false" >
<!-- 为防止Service被系统回收,可以通过提高优先级解决,1000是最高优先级,数字越小,优先级越低 -->
<intent-filter android:priority="1000"></intent-filter>
</service>





你可能感兴趣的:(android,service)