Service篇

1.Service:android四大组件之一,不需要与用户交互,但可以在后台长期运行的组件。
配置与使用:
*写一个类继承自Service,然后覆写onBinder方法。
*在清单文件中声明Service类。
*通过startService或者bindService启动。
2.启动方式(android5.0之前可以通过隐式启动,之后google要求必须用显式意图启动。)
方法一:
startService():访问者和service没有进行绑定,访问者退出之后,service仍然可以在后台运行。如制作音乐播放器,ac退出之后,仍可以播放。
方法二:
bindService():访问者和service进行了绑定,如果访问者退出,service也将退出。
3.生命周期:
startService启动时:
onCreate()->onStartCommand()->onDestory();
bindService启动时:
onCreate()->onBind()->-onUnBind()->onDestory();
4.基本用法:
*启动服务

Intent startIntent=new Intent(this,MyService.class);
startService(startIntent);

*停止服务

Intent stopIntent=new Intent(this,MyService.class);
startService(stopIntent);

5.活动和服务进行通信
*第一步:在服务类中新建一个类并继承Binder,然后在onBinder()中返回该类的实例,(在该类中可以做一些操作)
*第二步:在活动中创建一个ServiceConnection匿名类,在onServiceConnected()方法中通过乡下转型得到服务中的实例,有了这个实例就可以进行通讯了。
代码如下:

public class MyService extends Service {
    private DownLoadBinder mBinder=new DownLoadBinder();
 
    class DownLoadBinder extends Binder{
        public void startDownload(){
 
        }
        public int getProgress(){
            return 0;
        }
    }
 
    public MyService() {
    }
 
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
}
public class MainActivity extends Activity implements View.OnClickListener {
    Button btn1,btn2;
    private MyService.DownLoadBinder downLoadBinder;
 
    private ServiceConnection connection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            downLoadBinder= (MyService.DownLoadBinder) iBinder;
            downLoadBinder.startDownload();
            downLoadBinder.getProgress();
        }
 
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
        }
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn1=findViewById(R.id.btn1);
        btn2=findViewById(R.id.btn1);
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn1:
                Intent bindIntent=new Intent(this,MyService.class);
                //BIND_AUTO_CREATE标志位,表示活动和服务进行绑定后自动创建服务。
                bindService(bindIntent,connection,BIND_AUTO_CREATE);
                break;
            case R.id.btn2:
                unbindService(connection);
                break;
        }
    }
}

*讲解:这里首先创建一个ServiceConnection匿名类,在里面重写onServiceConnected()和onServiceDisConnected()方法,这两个方法分别会在活动与服务成功绑定以及解除绑定的时候调用。在onServiceConnected()方法中,又通过向下转型得到DownLoadBinder实例,有了这个实例,活动和服务之间的关系就变得紧密了。
6.前台服务
*作用:提高优先级,防止内存不足时,被回收。


Intent intent=new Intent(this,MainActivity.class);
PendingIntent pi=PendingIntent.getActivity(this,0,intent,0);
Notification notification=new NotificationCompat.Builder(this)
       .setContentTitle("This is content title")
       .setContentText("This is content text")
       .setWhen(System.currentTimeMillis())
       .setSmallIcon(R.mipmap.ic_launcher)
       .setLargeIcon(BitmapFactory.decodeResource(getResources(),
            R.mipmap.ic_launcher))
       .setContentIntent(pi)
       .build();
//启动前台服务
startForeground(1,notification);

7.IntentService
*解决ANR问题,并且运行完毕后,会自动停止。
*创建方式

public class MyIntentService extends IntentService {
    public MyIntentService(){
        //调用父类的有参构造方法
        super("MyIntentService");
    }
 
    //子线程中运行,可以做一些逻辑处理
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
    }
 
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

*启动方式

Intent intentService=new Intent(this,MyIntentService.class);
startService(intentService);

你可能感兴趣的:(android)