Service初步识别(三)
来源:互联网 发布:快盘关闭数据如何找回 编辑:程序博客网 时间:2024/06/05 19:25
从这个课程链接中学习总结的下文
为什么bindService那么容易被杀死还会存在,直接全用startService多好
bindService可以在service和activity中互相调用方法。
并且开始service的方法必须用同样的方法才能关闭服务。
所以一般都是用startSerice启动,使用bindService绑定服务
先上代码
定义一个service
<service android:name=".MyService2" android:enabled="true" android:exported="true"> </service>
service中的方法
public class MyService2 extends Service { public static String TAG="MyService"; private SecondActivity secondActivity; public class MyBinder extends Binder { //返回service方法的对象 public MyService2 getService(){ return MyService2.this; } //通过参数将mainActivity的参数传递给service public void setActivity(SecondActivity secondActivity){ MyService2.this.secondActivity=secondActivity; } } public MyService2() { } @Override public void onCreate() { Log.i(TAG,"onCreate"); Toast.makeText(getApplicationContext(),"onCreate",Toast.LENGTH_SHORT).show(); super.onCreate(); } @Override public IBinder onBind(Intent intent) { Log.i(TAG,"onBind");// 启动一个延时线程,来调用SecondActivity中的方法 new Thread(){ @Override public void run() { try { Thread.sleep(2000); if(secondActivity!=null){ secondActivity.doSomethingInActivity(); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); return new MyBinder(); } @Override public boolean onUnbind(Intent intent) { Log.i(TAG,"onUnbind"); Toast.makeText(getApplicationContext(),"onUnbind",Toast.LENGTH_SHORT).show(); return super.onUnbind(intent); } @Override public void onDestroy() { Log.i(TAG,"onDestroy"); Toast.makeText(getApplicationContext(),"onDestroy",Toast.LENGTH_SHORT).show(); super.onDestroy(); } public void doSomethingInService(){ Log.i(TAG,"doSomethingInService"); }}
acticity中的方法
public class SecondActivity extends AppCompatActivity { private Button bt1,bt2,bt3; public static String TAG="MyService"; private MyService2.MyBinder mMyBinder; private MyService2 mMyService2; //成员变量 private ServiceConnection conn=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //第二个参数就是onBind方法反会的是MyBinder对象 mMyBinder=(MyService2.MyBinder)service; //获得service的对象 mMyService2=mMyBinder.getService(); mMyBinder.setActivity(SecondActivity.this); } // 被系统回收才会调用 @Override public void onServiceDisconnected(ComponentName name) { //把绑定的参数都制空 unbind(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initView(); initClick(); } private void initClick() { //绑定Service bt1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(SecondActivity.this,MyService2.class); bindService(intent,conn,Service.BIND_AUTO_CREATE); } }); //接触绑定Service bt2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { unbindService(conn); } }); //通过bindService启动Service,调用service中的方法 bt3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mMyService2!=null){ mMyService2.doSomethingInService(); } } }); } private void initView() { bt1=(Button)findViewById(R.id.bt1); bt2=(Button)findViewById(R.id.bt2); bt3=(Button)findViewById(R.id.bt3); } private void unbind(){ conn=null; mMyService2=null; mMyBinder=null; } public void doSomethingInActivity(){ Log.i(TAG,"doSomethingInActivity"); }}
Activity中调用service的
在service中创建方法,方便调用
public void doSomethingInService(){ Log.i(TAG,"doSomethingInService"); }
创建MyBinder继承Binder
public class MyBinder extends Binder { //返回service方法的对象 public MyService2 getService(){ return MyService2.this; } }
onBind中返回MyBinder对象
@Override public IBinder onBind(Intent intent) { Log.i(TAG,"onBind");// 启动一个延时线程,来调用SecondActivity中的方法 new Thread(){ @Override public void run() { try { Thread.sleep(2000); if(secondActivity!=null){ secondActivity.doSomethingInActivity(); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); return new MyBinder(); }
在Activity中创建ServiceConnection
private MyService2.MyBinder mMyBinder; private MyService2 mMyService2;
//成员变量 private ServiceConnection conn=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //第二个参数就是onBind方法反会的是MyBinder对象 mMyBinder=(MyService2.MyBinder)service; //获得service的对象 mMyService2=mMyBinder.getService(); } // 被系统回收才会调用 @Override public void onServiceDisconnected(ComponentName name) { //把绑定的参数都制空 unbind(); } };
//通过bindService启动Service,调用service中的方法 bt3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mMyService2!=null){ mMyService2.doSomethingInService(); } } });
在service中调用activity中的方法
在MyBinder方法中,通过参数将SecondActivity的参数传递给service
public void setActivity(SecondActivity secondActivity){ MyService2.this.secondActivity=secondActivity; }
在ServiceConnection 的onServiceConnected
//service获得activity对象 mMyBinder.setActivity(SecondActivity.this);
在IBinder 的onBind方法中启动线程执行SecondActivity中的方法
@Override public IBinder onBind(Intent intent) { Log.i(TAG,"onBind");// 启动一个延时线程,来调用SecondActivity中的方法 new Thread(){ @Override public void run() { try { Thread.sleep(2000); if(secondActivity!=null){ secondActivity.doSomethingInActivity(); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); return new MyBinder(); }
效果展示
阅读全文
0 0
- Service初步识别(三)
- Service 初步(1)
- 语音识别方法三:使用Service调用语音识别程序
- 语音识别方法三:使用Service调用语音识别程序
- 语音识别方法三:使用Service调用语音识别程序
- 风机桨叶故障诊断(三) 识别桨叶——初步构建BP神经网络
- 线程初步(三)
- Service初步
- Service初步
- Service初步
- Service初步
- usb手机型号的识别(初步研究)
- 场景识别论文阅读感想(初步)
- web Service 初步学习(1)
- Android中的服务Service初步(1)
- 【Android学习】Android服务之Service(1)--Service初步
- Linux初步学习 (三)
- Servlet 初步(三) cookies
- N!again
- ESP8266字节序与比特序的验证
- 什么是spurious wakeups(虚假唤醒)
- 关于ABI OABI EABI
- armel和armhf区别
- Service初步识别(三)
- 使用spawn和expect实现自动交互
- macOS文本编辑快捷键
- eclipse关联svn
- Debian下安装Nginx笔记
- 2017.7.26 mqtt相关理解
- 前端数据接口被恶意调用 两个例子
- 安装Debian后的基本配置
- Nginx常用模块