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


相关推荐

  • 大学最应该学习的 5 门课, 毕业后大厂 Offer 直接拿到手软!「建议收藏」

    大学最应该学习的 5 门课, 毕业后大厂 Offer 直接拿到手软!「建议收藏」时间如白驹过隙,我竟然已经是一名拥有13年编程经验的老油条了!有些自豪,因为自己从大一就开始学习的Java语言依然坚挺,几乎是编程语言中的霸主了;但也有些遗憾,大学的时候没有把这些计算机基础课程学好,有些甚至没有学,导致工作后有很长一段时间蛮吃力的,全靠近些年“废寝忘食”的补课,才有所好转。希望学弟学妹们,能从我这些经验中获得一些启发,少走一些弯路。1)计算机编程的基石——数据结构与算法2)计算机编程语言的母胎——C语言3)计算机组成原理4)计算机操作系统5)计算机网络一、数据结构

    2022年4月29日
    58
  • 共勉:作为一名程序员你应该怎么提一个高质量的问题?

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!又是一个周五,今天依旧不分享技术,这几天不知道怎么,感觉有点累,昨天十点就睡觉了,很久没有这么早睡觉了。现在已经是晚上10点了,我还在码字中,今天争取早点睡觉。今天整理一点关于如何提问的内容,因为最近一段时间有一些技术朋友加我好友,一起探讨一些技术问题。但是一些伙伴加我之后,提问的姿势可能有点不太正确,导致聊了很一会…

    2022年2月28日
    42
  • 铁通宽带dns地址(成都dns的服务器地址是多少)

    全国各地电信DNS见下:—————————————————————-北京DNS地址:202.96.199.133202.96.0.133202.106.0.20202.106.148.1202.97.16.195上海DNS地址:202.96.199.132202.96.199.133202.96.20

    2022年4月16日
    104
  • callee和caller的区别_caller中文

    callee和caller的区别_caller中文Javascriptarguments.callee和caller的区别一、callee  在学习callee之前,需要先学习arguments。  arguments:含义:该对象代表正在执行的函数和调用它的函数的参数。 语法: 1 [function.]arguments[n]   参数:function:当前正在执行的Func…

    2025年6月20日
    0
  • pycharm flask框架_挣钱的项目

    pycharm flask框架_挣钱的项目基于Pycharm轻松创建Flask项目需要pycharm专业版,社区版是没有项目模板的,也可以手动创建这几个文件夹完成模板的创建。打开Pycharm的file,选择创建新的项目,然后弹出对话框,我们可以看到里面有很多的案例,Flask、Django等等,我们选择生成Flask的demo程序选择创建之后一个简易的Flask项目就出现在我们眼前,第一个是入口程序,还有一个static的静态目录,templates是模板存放的位置我们可以手动来启动这个Flask项目,但是这不是很理智的,在Pych

    2022年8月28日
    1
  • navicat15 激活码(破解版激活)

    navicat15 激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    44

发表回复

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

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