Android开发Android技术知识Android开发经验谈

关于Service各种知识点总结

2018-12-28  本文已影响12人  奔跑吧李博
Service生命周期:
启动模式:
1.Start方式:

启动后在后台单独执行,不给组件返回结果
调用onstartCommand,需要调用stopService才能停止service

2.Bind方式:

可与绑定的组件进行交互
Service可与多个组件绑定,不再与任何绑定才会destroy.
Service不是新的线程,也不是新的进程

看是否需要与用户交互,要交互用thread,不交互可用service。

Service启动方式

1.Service的第一种启动方式,采用start的方式开启服务

1.定义一个类继承Service
2.在Manifest.xml文件中配置该Service
3.使用Context的startService(Intent)方法启动该Service
4.不再使用时,调用stopService(Intent)方法停止该服务

使用这种start方式启动的Service的生命周期如下:
onCreate()--->onStartCommand() ---> onDestory()

特点:一旦服务开启跟调用者(开启者)就没有任何关系了。
开启者退出了,开启者挂了,服务还在后台长期的运行。
开启者不能调用服务里面的方法。

2.Service的第二种启动方式,采用bind的方式开启服务

1.定义一个类继承Service
2.在Manifest.xml文件中配置该Service
3.使用Context的bindService(Intent, ServiceConnection, int)方法启动该Service
4.不再使用时,调用unbindService(ServiceConnection)方法停止该服务

使用这种start方式启动的Service的生命周期如下:
onCreate() --->onBind()--->onunbind()--->onDestory()

特点:bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。
绑定者可以调用服务里面的方法。

启动过程代码:
public class MainActivity extends Activity {

    private MyConn conn;
    private Intent intent;
    private IMyBinder myBinder;

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

    //开启服务按钮的点击事件
    public void start(View view) {
        intent = new Intent(this, MyService.class);
        conn = new MyConn();
        //绑定服务,
        // 第一个参数是intent对象,表面开启的服务。
        // 第二个参数是绑定服务的监听器
        // 第三个参数一般为BIND_AUTO_CREATE常量,表示自动创建bind
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

    //调用服务方法按钮的点击事件
    public void invoke(View view) {
        myBinder.invokeMethodInMyService();
    }

    private class MyConn implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //iBinder为服务里面onBind()方法返回的对象,所以可以强转为IMyBinder类型
            myBinder = (IMyBinder) iBinder;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
        }
    }
}

关于Service其它问题

Service做耗时操作容易引起ANR,所以创造一个IntentService是处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。

重写onStartCommand()方法,将flags设置START_STICKY,服务被杀死之后系统会重新创建服务。

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        flags = START_STICKY;
        return super.onStartCommand(intent, flags, startId);
    }

Service中可以弹出对话框。比如当监听到电量变化,监听到接收短信,用Service监听,然后在Service中弹出对话框。

AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
            alertDialog.setMessage("有新消息,是否查看?");
            alertDialog.setPositiveButton("否",
                    new DialogInterface.OnClickListener()
                    {
                        public void onClick(DialogInterface dialog, int which)
                        {
                        }
                    });
    
            alertDialog.setNegativeButton("是",
                    new DialogInterface.OnClickListener()
                    {
                        public void onClick(DialogInterface dialog, int which)
                        {
                        }
                    });
    
            ad = alertDialog.create();
            
            ad.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);  
            ad.setCanceledOnTouchOutside(false);//点击外面区域不会让dialog消失                               
            ad.show();

关键点是要给dialog添加setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT),类型是系统弹框。并加入系统弹框的权限。

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
上一篇下一篇

猜你喜欢

热点阅读