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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • std future get_waitkey(0)

    std future get_waitkey(0)一、关于std::future成员函数wait_for():1.1关于std::future_status:std::future_status是一个枚举类型,其值有三://ENUMfuture_statusenumclassfuture_status{//namesfortimedwaitfunctionreturnsready,timeout,deferred//延迟执行,当std::async()第一个参数为std::lanuch::de

    2025年9月28日
    3
  • PCIe卡的主要引脚 及 热插拔

    PCIe卡的主要引脚 及 热插拔目录1PCIe总线使用的信号1.1收发数据信号1.2辅助信号2热插拔参考资料1PCIe总线使用的信号PCIex1,x4,x8,x16卡的连接器引脚如下图所示,数据收发引脚为白色,辅助引脚为灰色:mechanicalkey对应防呆缺口的位置。1.1收发数据信号PCIe总线的层次分层图:与收发数据相关的线就是每个通路(lane)的两对差分传输线。PCIex1,x2,x4,x8,x16分别代表有1,2,4,8,16条lane。1.2辅助信号在连接器上提供辅助引脚来辅助

    2022年5月7日
    489
  • python怎么表示取余_python如何实现取余操作

    python怎么表示取余_python如何实现取余操作python实现取余操作的方法:可以利用求模运算符(%)来实现。求模运算符可以将两个数相除得到其余数。我们还可以使用divmod()函数来实现取余操作,具体方法如:【divmod(10,3)】。在python中要实现取余操作可以使用求模运算符(%),该运算符可以将两个数相除得到其余数。(推荐教程:Python入门教程)如果一个数恰好能被另外一个数据整除,则余数为0,%运算后返回结果为0。可利用余数…

    2022年4月25日
    58
  • 关于 Sensor flicker/banding现象的解释「建议收藏」

    关于 Sensor flicker/banding现象的解释「建议收藏」目录1、基本概念2、30fps,1帧内banding过程演示3、30fps,帧与帧之间banding过程演示4、25fps,帧与帧之间banding过程演示5、总结flicker交流电网中的传输的能量并不是稳定不变的,而是随着一个固定频率变化的,这个频率一般被称为工频,例如中国是50Hz,美国是60Hz。工频由电力系统决定。工频的带来的这种能量变化称为flicker。下面以50HZ为例进行解释,交流电以1/50s,即20ms的周期进行变化,其变化规律如图所示:而对于能量来说,并没有正负之分,因此能量

    2022年10月13日
    1
  • 模拟城市完美布局平面图_css四大布局

    模拟城市完美布局平面图_css四大布局我们之前已经学过一些布局模型,比如说浮动,绝对定位等等,但是这些布局方式一是不够简洁,而是使用的范围确实是太窄了。flex模型拥有比较多的属性,来设置多样的布局方式,接下来我们就详细介绍各种属性对布局的改变,最后再对属性做一个汇总先看一下flex的基本模型,如下图所示:container父容器里有三个子元素flex-item。当给父容器设置display:flex;直接子元素就有布…

    2025年6月15日
    2
  • eplan激活码破解步骤-通用破解码【中文破解版】[通俗易懂]

    (eplan激活码破解步骤-通用破解码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~2KLKA7BQFO-eyJsaWNlbnNlSWQiOi…

    2022年4月1日
    1.4K

发表回复

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

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