Android之Service通信-(2)

一、Service通过IBinder与Activity进行通信

在Service中进行下载

Service

package chuiyuan.lsj.androidjava.service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class DownloadService extends Service {
    private String TAG ="MainService" ;

    public class MyBinder extends Binder{
        public DownloadService getService(){
            return DownloadService.this;
        }
    }

    public void startDownload() throws InterruptedException{
        //可以看出,这里是在主线程,所以如果真的下载,应该另开一个线程
        Toast.makeText(DownloadService.this,"start download:"+Thread.currentThread().getName(),
                Toast.LENGTH_LONG).show();
        Thread.sleep(2);
        Toast.makeText(DownloadService.this, "download end", Toast.LENGTH_LONG).show();
    }

    //public MyBinder myBinder ;
    public DownloadService() {
    }

    @Override
    public void onCreate() {
        Log.d(TAG, "onCreate");
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
        super.onDestroy();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return  new MyBinder();
    }
}

测试

public class DownloadActivity extends BaseActivity{

    private DownloadService downloadService;
    private ServiceConnection sc = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            downloadService = ((DownloadService.MyBinder)service).getService();
            try{
                downloadService.startDownload();
            }catch (InterruptedException e){
                e.printStackTrace();
            }

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    } ;
    @Override
    protected void findView() {
        setContentView(R.layout.activity_download);
    }

    @Override
    protected void initView() {

    }

    @Override
    protected void setOnClickListener() {

    }

    @Override
    public void onClick(View v) {

    }

    @Override
    protected void onStart() {
        super.onStart();
        Intent bindIntent = new Intent(this, DownloadService.class);
        this.bindService(bindIntent, sc, BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        unbindService(sc);
    }

}

二、Service通过Broadcast与Activity通信

Service

/**
 * Service通过BroadCast广播与Activity通信
 * sendBroadcast from Service--->Android System--->
 * Receive by broadcastReceiver in Activity
 */
public class BroadcastService extends Service {
    private String TAG ="BroadcastService" ;

    public class MyBinder extends Binder{
        public BroadcastService getService(){
            return BroadcastService.this;
        }
    } ;

    public void sendServiceBroadcast() throws InterruptedException{
        Toast.makeText(BroadcastService.this, "download in thread:"+ Thread.currentThread().getName(),
                Toast.LENGTH_SHORT).show();
        Intent intent = new Intent() ;
        intent.setAction("chuiyuan.lsj.androidjava.service.broadcastservice") ;
        intent.putExtra("value", 1000) ;
        sendBroadcast(intent);
        Toast.makeText(BroadcastService.this, "send over", Toast.LENGTH_LONG).show();
    }

    public BroadcastService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return  new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //如果 是用的startService,可以在这里执行
//        Toast.makeText(this, "onCreate:send broadcast", Toast.LENGTH_SHORT).show();
//        try {
//            sendServiceBroadcast();
//        }catch (InterruptedException e){
//            e.printStackTrace();
//        }

    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "onStartCommand", Toast.LENGTH_SHORT).show();
        return super.onStartCommand(intent, flags, startId);
    }
}

测试

public class ServiceSendbroadcastActivity extends BaseActivity{

    private BroadcastService broadcastService;

    private ServiceConnection sc = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            broadcastService = ((BroadcastService.MyBinder)service).getService();
            try{
                broadcastService.sendServiceBroadcast();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    } ;

    @Override
    protected void findView() {
        setContentView(R.layout.activity_service_sendbroadccast);
    }

    @Override
    protected void initView() {
        //广播注册
        IntentFilter filter = new IntentFilter() ;
        filter.addAction("chuiyuan.lsj.androidjava.service.broadcastservice");
        registerReceiver(serviceReceiver, filter) ;
    }

    @Override
    protected void setOnClickListener() {

    }

    @Override
    public void onClick(View v) {

    }

    @Override
    protected void onStop() {
        super.onStop();
        unbindService(sc);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Intent bindIntent = new Intent(this, BroadcastService.class) ;
        bindService(bindIntent, sc, BIND_AUTO_CREATE);
    }

    public BroadcastReceiver serviceReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle extras = intent.getExtras() ;
            if (extras!= null){
                if (extras.containsKey("value")){
                    //这里可以做下载,发包等
                    Toast.makeText(ServiceSendbroadcastActivity.this,
                            "receive broadcast:"+extras.get("value"), Toast.LENGTH_SHORT).show();

                }
            }
        }
    } ;

}

  

  

  

  

时间: 2024-10-20 04:56:05

Android之Service通信-(2)的相关文章

(六)Android中Service通信

一.启动Service并传递参数 传递参数时只需在startService启动的Intent中传入数据便可,接收参数时可在onStartCommand函数中通过读取第一个参数Intent的内容来实现 1.MainActivity.java package com.example.shiyanshi.serviceconnected; import android.app.Activity;import android.content.Intent;import android.os.Bundle

Android之Service通信

一.本地Service通信 LocalService /** * Created by lsj on 2015/8/29. * 这是一个LocalService */ public class StrReplaceService extends Service { private final String TAG="StrReplaceService" ; public class MyBinder extends Binder{ public StrReplaceService ge

【学习笔记】Android中Service通信

一.Service的生命周期(onCreate onStart onDestroy onBind ) 1). 被启动的服务的生命周期:如果一个Service被某个Activity 调用 Context.startService 方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行.如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStart

Android中Service通信(一)——启动Service并传递数据

启动Service并传递数据的小实例(通过外界与服务进行通信): 1.activity_main.xml: <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:text="默认信息" android:id="@+id/etData"/> <Button android:text=&

android 远程Service以及AIDL的跨进程通信

在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问题了. 转换成远程Service非常简单,只需要在注册Service的时候将他的android:process的属性制定成 :remote就可以了. 重新运行项目,你会发现,不会出现ANR了. 为什么将MyService转换成远程Service后就不会导致程序ANR了呢?这是由于,使用了远程Serv

Android中Service与多个Activity通信

由于项目需要,我们有时候需要在service中处理耗时操作,然后将结果发送给activity以更新状态.通常情况下,我们只需要在一个service与一个activity之间通信,通常这种情况下,我们使用最多的是通过回调接口.具体做法是在service中定义一个接口,在activity中实现该接口,并通过bindservice来传入.实现方式很简单,在此不再赘述. 当需要将service中的结果一次发送给多个activity时,我们又该如何实现呢?经过多个项目的积累,总结了三种实现的方式.分别是回

Android通过Service调用远程接口—AIDL-进程间通信

在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信.为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call 远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Andorid Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Se

Android Web Service学习总结(一)

最近学习android平台调用webWebService,学习了一篇不错的博客(http://blog.csdn.net/lyq8479/article/details/6428288),可惜是2011年时的方法,而不适合现在android4.0之后的android版本,所以通过一番学习和研究,总结如下. web Service简介 通俗的理解:通过使用WebService,我们能够像调用本地方法一样去调用远程服务器上的方法.我们并不需要关心远程的那个方法是Java写的,还是PHP或C#写的:我

Android中远程Service浅析

上一篇文章中简单的写了一下关于Android中Service的两种启动方式,不过都是本地的服务,今天就简单的写下关于Android中远程Service的使用,学习之前先了解两个概念,AIDL( Android Interface definition language)字面上的意思就是借口定义语言,专业一点理解就是Android进程之间通信的借口描述语言.IPC(Inter-Process Conmmunication)内部进程之间的通信,同一个手机上,如果你的APP需要访问调用另外一个APP的