bindService与startService区别

bindService与startService区别1.StartedService中使用startService()方法来进行方法的调用,调用者和服务之间没有联系,即使调用者退出了,服务依然在进行【onCreate()->onStart

大家好,又见面了,我是你们的朋友全栈君。

1. Started Service中使用startService()方法来进行方法的调用,调用者和服务之间没有联系,即使调用者退出了,服务依然在进行 【onCreate()-  >onStartCommand()->startService()->onDestroy()】,注意其中没有 onStart(),主要是被onStartCommand()方法给取代了,onStart方法不推荐使用了。
2. BindService中使用bindService()方法来绑定服务,调用者和绑定者绑在一起,调用者一旦退出服务也就终止了【onCreate()->onBind()->onUnbind()->onDestroy()】。

 

example:service与activity间通信

MainActivity

  1 package com.stone.test2;
  2 
  3 import android.content.ComponentName;
  4 import android.content.Context;
  5 import android.content.Intent;
  6 import android.content.ServiceConnection;
  7 import android.os.IBinder;
  8 import android.os.Message;
  9 import android.support.v7.app.ActionBarActivity;
 10 import android.os.Bundle;
 11 import android.view.Menu;
 12 import android.view.MenuItem;
 13 import android.view.View;
 14 import android.widget.EditText;
 15 import android.widget.TextView;
 16 
 17 import java.util.logging.Handler;
 18 import java.util.logging.LogRecord;
 19 
 20 
 21 public class MainActivity extends ActionBarActivity implements View.OnClickListener, ServiceConnection {
 22 
 23     private EditText edittext;
 24     private TextView textview;
 25     private MyService.MyBinder myBinder;
 26 
 27     @Override
 28     protected void onCreate(Bundle savedInstanceState) {
 29         super.onCreate(savedInstanceState);
 30         setContentView(R.layout.activity_main);
 31         edittext= (EditText) findViewById(R.id.edittext);
 32         textview= (TextView) findViewById(R.id.textview);
 33         System.out.println("onCreate");
 34         findViewById(R.id.btnStart).setOnClickListener(this);
 35         findViewById(R.id.btnStop).setOnClickListener(this);
 36         findViewById(R.id.btnBindService).setOnClickListener(this);
 37         findViewById(R.id.btnUnbindService).setOnClickListener(this);
 38         findViewById(R.id.btnSyn).setOnClickListener(this);
 39 
 40     }
 41 
 42     @Override
 43     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 44         super.onActivityResult(requestCode, resultCode, data);
 45         textview.setText(data.getStringExtra("data"));
 46     }
 47 
 48     @Override
 49     public boolean onCreateOptionsMenu(Menu menu) {
 50         // Inflate the menu; this adds items to the action bar if it is present.
 51         getMenuInflater().inflate(R.menu.menu_main, menu);
 52         return true;
 53 
 54     }
 55 
 56     @Override
 57     public boolean onOptionsItemSelected(MenuItem item) {
 58         // Handle action bar item clicks here. The action bar will
 59         // automatically handle clicks on the Home/Up button, so long
 60         // as you specify a parent activity in AndroidManifest.xml.
 61         int id = item.getItemId();
 62 
 63         //noinspection SimplifiableIfStatement
 64         if (id == R.id.action_settings) {
 65             return true;
 66         }
 67 
 68         return super.onOptionsItemSelected(item);
 69     }
 70 
 71     @Override
 72     public void onClick(View v) {
 73         switch (v.getId()) {
 74             case R.id.btnStart:
 75 //                System.out.println("who are you");
 76                 Intent intent = new Intent(this,MyService.class);   //starService通过intent把数据传给MyService
 77                 intent.putExtra("data",edittext.getText().toString());
 78                 startService(intent);
 79                 break;
 80             case R.id.btnStop:                                 //stopService
 81                 stopService(new Intent(this, MyService.class));
 82                 break;
 83             case R.id.btnBindService:                       //binService,通过实现ServiceConnection,将数据传给MyService
 84                 bindService(new Intent(this,MyService.class),this, Context.BIND_AUTO_CREATE);
 85                 break;
 86             case R.id.btnUnbindService:
 87                 unbindService(this);
 88                 break;
 89             case R.id.btnSyn:                      //同步数据,将数据传给MyService
 90                 if (myBinder!=null){
 91                     myBinder.setData(edittext.getText().toString());
 92                 }
 93                 break;
 94         }
 95     }
 96 
 97     @Override
 98     public void onServiceConnected(ComponentName name, IBinder service) {
 99         myBinder = (MyService.MyBinder) service;  //同步数据,将数据传给MyService
100         myBinder.getService().setCallback(new MyService.callBack() {   //获取MyService传来的数据
101             @Override
102             public void onDataChange(String data) {  //因为在MyService中是在另一个线程中调用onDataChange,所以通过handler将数据传送给UI线程
103                 Message msg = new Message();
104                 Bundle bundle = new Bundle();
105                 bundle.putString("data",data);
106                 msg.setData(bundle);
107                 handler.sendMessage(msg);
108             }
109         });
110     }
111 
112     @Override
113     public void onServiceDisconnected(ComponentName name) {
114 
115     }
116 
117     private android.os.Handler handler = new android.os.Handler(){  //通过Handler获取工作线程传来的数据,并显示在TextView中
118         @Override
119         public void handleMessage(Message msg) {
120             super.handleMessage(msg);
121             textview.setText(msg.getData().getString("data"));
122         }
123     };
124 }

MyService

 1 package com.stone.test2;
 2 
 3 import android.app.Service;
 4 import android.content.Intent;
 5 import android.os.Binder;
 6 import android.os.IBinder;
 7 
 8 public class MyService extends Service {
 9     private String data;
10     private boolean running;
11 
12     public MyService() {
13     }
14 
15     @Override
16     public IBinder onBind(Intent intent) {
17         return new MyBinder();
18     }
19 
20     public class MyBinder extends Binder{
21 
22         public void setData(String data){ //bindservice方式获取Activity传送来的数据
23             MyService.this.data=data;
24         }
25 
26         public MyService getService(){  //返回MyService
27             return MyService.this;
28         }
29     }
30 
31     @Override
32     public int onStartCommand(Intent intent, int flags, int startId) {
33         data = intent.getStringExtra("data");  //startService方式获取Activity传送来的数据
34         return super.onStartCommand(intent, flags, startId);
35     }
36 
37     @Override
38     public void onCreate() {
39         super.onCreate();
40         running = true;
41         new Thread(){
42             @Override
43             public void run() {
44                 super.run();
45                 int i = 0;
46                 //   System.out.println("fucking");
47                 while (running) {
48                     i++;
49                     String str=i+":" + data;
50                     if (callback!=null) {
51                         callback.onDataChange(str);
52                     }
53                     System.out.println(str);
54                     try {
55                         sleep(1000);
56                     } catch (InterruptedException e) {
57                         e.printStackTrace();
58                     }
59                 }
60             }
61         }.start();
62 
63     }
64 
65     @Override
66     public void onDestroy() {
67         super.onDestroy();
68         running = false;
69     }
70 
71     private callBack callback = null;
72 
73     public void setCallback(callBack callback){
74         this.callback = callback;
75     }
76 
77     public callBack getCallback(){
78         return callback;
79     }
80 
81     public static interface callBack{  //bindService通过回调函数将数据传送给Activity
82         void onDataChange(String data);
83     }
84 }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155580.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu重启nginx_ubuntu配置nginx

    ubuntu重启nginx_ubuntu配置nginx大家好,我是极智视界,本文介绍一下ubuntu安装nginx的方法。

    2022年9月19日
    0
  • eBPF 学习路径总结「建议收藏」

    eBPF 学习路径总结「建议收藏」BPF学习路径总结•Feiskyhttps://feisky.xyz/posts/2021-01-06-ebpf-learn-path/目录1.为什么要学习BPF2.BPF应该怎么学习2.1BPF书籍2.2BPF学习样例3.BPF资料汇总3.1介绍系列3.2深入系列3.3Linux资源作者简介:狄卫华,趣头条资深架构师,主要关注云原生相关领域,目前聚焦在BPF技术及实践.1.为什么要学习BPF可以先从ebpf.i.

    2022年9月21日
    0
  • linux运维面试题大厂,大厂Linux运维面试题详解「建议收藏」

    linux运维面试题大厂,大厂Linux运维面试题详解「建议收藏」大厂面试题:网络基础类面试题01.Linux运维经典面试题_网络基础-视频介绍02.Linux运维经典面试题_网络基础-面试题103.Linux运维经典面试题_网络基础-面试题204.Linux运维经典面试题_网络基础-面试题3Linux系统管理类面试题05.Linux运维经典面试题_Linux系统管理类-权限优化06.Linux运维经典面试题_Linux系统管理类-备份策略07.Linux运维经…

    2022年5月27日
    31
  • pycharm使用远程python虚拟环境_pycharm自带python吗

    pycharm使用远程python虚拟环境_pycharm自带python吗虽然pycharm很耗内存,但这依然阻挡不了它灰常好用的优势,电脑配置不够的话建议选择19年的pycharm版本,16G的内存带2021.2.1运行起来是这样:首先确定pycharm用的是专业版,社区版不提供远程服务的功能。1.配置远程服务器信息并测试菜单栏Tools—->Deployment—->Configuration显示如下界面:新建一个连接,协议类型选择SFTP,不要选其他两种,其他两种实现的功能不一样,并且一般服务器上也不会开放21端口,SFTP使用的是

    2022年8月27日
    0
  • 选择器gt_css的基本选择器

    选择器gt_css的基本选择器一、后代选择器选取指定元素的后代元素与子元素选择器相比,后代选择器选取的不一定是直接后代(儿子),而是作用于所有后代元素(儿子、孙子、重孙…)都可以。二、(>)子元素选择器选取某个元素的

    2022年8月1日
    3
  • ora01017 linux,ORA-01017: invalid username/password; logon denied 解决办法

    ora01017 linux,ORA-01017: invalid username/password; logon denied 解决办法ORA-01017:invalidusername/password;logondenied解决办法环境介绍:操作系统RHEL6.4X64、数据库:ORACLE11.2.0.4.0;在现有环境下手动创建数据库,在数据库的手动创建过程中没有大的问题,但在数据库创建完成后出现在本地可以登录数据库用户包括管理员账户,通过客户端远端无法登录报如下错误:通过测试,或者在数据库系统中更换用户账户口…

    2022年5月6日
    271

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号