Android--本地Service

Service

Service是什么?
1,Service是一个应用程序组件,它用来后台完成一个 时间跨度比较大 的工作且 没有任何关联界面

2,service可以完成下面这些工作:
访问网络
播放音乐
文件IO操作
大数据的数据库操作

3,服务的特点:

  • service在后台运行,不能与用户进行交互
  • 即使应用退出,服务也不会停止
  • 在默认情况下,service运行在应用程序的主线程中,如果需要service处理一些网络连接等耗时操作,那么应该将这些任务放在分线程中处理,避免阻塞用户界面

(总结下上面的:“服务”也就是说,当你关闭的应用时(不是清理进程),你的activity是死掉的,但是你的服务(不是绑定启动)还在后台运行。如果绑定启动的话,就是随activity一起死去。)

Service的分类:

1,本地服务LocalService

  • Service对象与Service的启动者在同个进程中运行,两者的通信是进程内通信

2,远程服务RemoleService

  • Service对象与Service的启动者不在同个进程中运行,这时存在一个进程间通信的问题,Android专门为此设计了AIDL来实现进程间的通信

启动与停止服务:

1,方式一:一般启动

  • context.startService(Intent intent)
  • context.stopService(Intent intent)

2,方式二:绑定启动

  • 1,context.bindService(Intent intent,ServiceConnection connection)
  • 2,context.unbindService(ServiceConnection connection)

先上布局截图吧(代码应该不需要上了吧…):
在这里插入图片描述

步骤也就是首先要创建一个继承Service的子类:

public class MyLocalService extends Service {


    public MyLocalService(){
        Log.e("TAG","MyService()");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("TAG","MyService onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("TAG","MyService onDestroy");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.e("TAG","MyService onBind");
        return new Binder();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("TAG","MyService startCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e("TAG","MyService onUnBind");
        return super.onUnbind(intent);
    }
}

因为它是Context的子类(activity也是context的子类),所以它可以用context的方法(onCreate()onDestroy()StartCommand(Intent intent, int flags, int startId))可以来测试声明周期。

main代码:

public class MainActivity extends AppCompatActivity {

    private Button btn_1,btn_2,btn_3,btn_4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_1=(Button)findViewById(R.id.btn_1);
        btn_2=(Button)findViewById(R.id.btn_2);
        btn_3=(Button)findViewById(R.id.btn_3);
        btn_4=(Button)findViewById(R.id.btn_4);
    }


    //启动服务
    public void startMyService(View view){
        Intent intent=new Intent(this,MyLocalService.class);
        startService(intent);
        Toast.makeText(this,"start seervic",Toast.LENGTH_SHORT).show();
    }

    //停止服务
    public void stopMyservice(View view){
        Intent intent=new Intent(this,MyLocalService.class);
        stopService(intent);
        Toast.makeText(this,"stop service",Toast.LENGTH_SHORT).show();
    }

    private ServiceConnection sc;
	
	//绑定启动
    public void bindService(View view){
    	//判断activity是否绑定服务
        if(sc==null) {
            Intent intent = new Intent(this, MyLocalService.class);
            
            sc = new ServiceConnection() {
                //创建连接对象时启动
                @Override
                public void onServiceConnected(ComponentName name, IBinder service) {
                    Log.e("TAG", "onServiceConnected()");
                }

                //当服务断开时
                @Override
                public void onServiceDisconnected(ComponentName name) {
                    Log.e("TAG", "onServiceDisconnected()");
                }
            };
            
            //绑定服务
            bindService(intent, sc, BIND_AUTO_CREATE);
            
            Toast.makeText(this, "bind service", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "已经bind service", Toast.LENGTH_SHORT).show();
        }
    }

	//解除绑定
    public void unbindService(View view){
        if(sc!=null) {
            unbindService(sc);
            //如果不设置null,即使解除了绑定,activity也绑定不了服务
            sc=null;
            
            Toast.makeText(this, "unbindservice", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "未bind service", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(sc!=null){
            unbindService(sc);
            sc=null;
        }
    }
}

下面代码的意思是:我们关闭页面前运行这个方法。这里的用途是,如果我们绑定启动,当我们未解除绑定就关掉页面,那么会出现内存泄露(好像是内存泄漏吧)。所以我们在关掉页面时,我们判断是否解除绑定,若未解除绑定,则解除绑定。

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(sc!=null){
            unbindService(sc);
            sc=null;
        }
    }

最后经过测试,各方法创建服务的生命周期为:

1,startService()

  • 第一次调用:构造方法()->onCreate()->onStartCommand()
  • (重要)后面再调用:->onStartCommand()

2,stopService():

  • ->onDestory()

3,bindService():

  • 调用:构造方法()->onCreate()->onBind()->onServiceConnected()

4,unbindService:

  • 调用:(当前只有Activity与Service连接)->onUnbind()->onDestory()
发布了49 篇原创文章 · 获赞 0 · 访问量 1406

猜你喜欢

转载自blog.csdn.net/qq_43616001/article/details/104042334