`
一夕剑
  • 浏览: 55258 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

activity与service的交互

 
阅读更多

Activity访问service有两种方式,第一种是通过Ibinder接口实现步骤如下

Service类中

public class PlayerService extends Service {

private final IBinder binder = new MyBinder();

@Override

    public IBinder onBind(Intent intent) {

              return binder;

    }

 

    public class MyBinder extends Binder {

       public PlayerService getService() {

           return PlayerService.this;

       }

    }

}

通过MyBinder内部类得到当前service的实例

在要访问serviceactivity

 

 

/**

* PlayerService类中定义了一个MyBinder类,该类实际上是为了获得PlayerService的对象实例的。

* ServiceConnection接口的onServiceConnected方法中的第2个参数是一个IBinder类型的变量,

* 将该参数转换成PlayerService.MyBinder对象,并使用MyBinder类中的getService方法获得PlayerService对象。

     * 在获得PlayerService对象后,就可以在Activity中随意操作PlayerService了。

     */

public class PlayerActivity extends Activity{

private PlayerService serviceBinder;

ServiceConnection connection = new ServiceConnection() {

       public void onServiceDisconnected(ComponentName name) {

           serviceBinder = null;

       }

      

    public void onServiceConnected(ComponentName name, IBinder service) {

           serviceBinder = ((PlayerService.MyBinder)service).getService();

          

 

 

       }

    };

}

然后调用bindService() 建立连接。

这里的代码是跳转并绑定service

Intent i=new Intent();

              i.setClass(PlayerActivity.this, PlayerService.class);

              i.putExtra("mp3info", mp3Info);

              i.putExtra("MSG", AppConstant.PalyerMsg.PRE_MSG);

              startService(i);

              bindService(i, connection, Context.BIND_AUTO_CREATE);

 

得到serviceBinder后,就可以通过serviceBinder调用service里面的方法了。

第二种方式是通过aidl,具体实现如下

1.建立aidl文件,如果aidl文件的内容是正确的话,ADT会自动生成一个java接口文件(*.java)

2.建立服务类(Service的子类)

3.实现由aidl文件生成的java接口

4.AndroidManifest.xml文件中配置aidl服务。要注意的是<action>标签中android:name的属性值就是要引用该服务的ID,也就是Intent类的参数值.

 

1.Aidl文件内容

package net.blogjava.mobile.aidl;

interface IMyService

{

    String getValue();

}

2.编写完后会生成一个同名的java文件,这里是IMyService.java我们不需要管这个java文件

3.编写一个MyService. MyServiceService的子类,MyService类中定义了一个内嵌类(MyServiceImpl)该类是IMyService.Stub的子类.

package net.blogjava.mobile.aidl;

 

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;

 

public class MyService extends Service {

 

    public class MyServiceImpl extends IMyService.Stub {

       @Override

       public String getValue() throws RemoteException {

           // TODO Auto-generated method stub

           return "Android/OPhone开发讲义";

       }

 

    }

    @Override

    public IBinder onBind(Intent intent) {

       return new MyServiceImpl();

    }

 

}

4.AndroidManifest.xml文件中配置MyService,因为这里是跨进程访问service所以是用指定action的方式.如果在同一个进程中可以不用过滤的intent-filter,只写一个

<service android:name=".MyService" >这样的就可以了,此处是跨进程所以代码写成这样:

 

<service android:name=".MyService" >

           <intent-filter>

              <action android:name="net.blogjava.mobile.aidl.IMyService" />

           </intent-filter>

       </service>

 

下面是客户端的代码

1.  将自动生成的IMyService.java文件连同包一起复制到客户端工程项目中

2.  客户端的代码如下(可以参考android 项目示例src目录下ch08_aidlclientch08_aidl)

package net.blogjava.mobile;

 

import net.blogjava.mobile.aidl.IMyService;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle;

import android.os.IBinder;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

 

public class Main extends Activity implements OnClickListener {

    private IMyService myService = null;

    private Button btnInvokeAIDLService;

    private Button btnBindAIDLService;

    private TextView textView;

    private ServiceConnection serviceConnection = new ServiceConnection() {

 

       @Override

       public void onServiceConnected(ComponentName name, IBinder service) {

           myService = IMyService.Stub.asInterface(service);

           btnInvokeAIDLService.setEnabled(true);

 

       }

 

       @Override

       public void onServiceDisconnected(ComponentName name) {

           // TODO Auto-generated method stub

 

       }

    };

 

    @Override

    public void onClick(View view) {

       switch (view.getId()) {

       case R.id.btnBindAIDLService:

           bindService(new Intent("net.blogjava.mobile.aidl.IMyService"),

                  serviceConnection, Context.BIND_AUTO_CREATE);

           break;

 

       case R.id.btnInvokeAIDLService:

           try {

              textView.setText(myService.getValue());

           } catch (Exception e) {

 

           }

           break;

       }

 

    }

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

       btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);

       btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService);

       btnInvokeAIDLService.setEnabled(false);

       textView = (TextView) findViewById(R.id.textview);

       btnInvokeAIDLService.setOnClickListener(this);

       btnBindAIDLService.setOnClickListener(this);

    }

}

分享到:
评论
1 楼 fff32165 2011-08-26  
LZ好牛啊!膜拜ing

相关推荐

    android中activity和service的交互

    - 解绑Service:当不再需要与Service交互时,记得调用`unbindService()`,避免内存泄漏。 2. **通信机制** - 通过 Binder 对象:Activity通过Binder对象可以调用Service中的方法,实现数据传递和功能调用。这种...

    activity service 数据交互

    下面是一个简单的BroadcastService交互示例: ```java // Service中的部分 public class MyService extends Service { public void sendDataToActivity(String data) { Intent intent = new Intent(...

    Service与多个Activity交互

    当一个Service需要与多个Activity进行数据交换或控制交互时,Broadcast(广播)就起到了关键的作用。 **Broadcast(广播):** BroadcastReceiver是Android系统中的一个重要组件,它用于接收系统或应用发送的广播...

    Activity绑定Service(Kotlin)

    Activity可以通过`IBinder`与Service交互,例如传递数据或控制Service的行为。 9. **Kotlin的协程支持** 为了优化Service中的异步操作,Kotlin提供了协程支持。在Service中使用协程可以避免主线程阻塞,提高用户...

    Android Activity 与Service进行数据交互详解

    Activity通常负责用户界面的展示,与用户进行直接交互,而Service则在后台默默执行任务,不与用户界面直接关联。两者之间的数据交互是构建复杂应用程序不可或缺的部分。 首先,从设计角度来看,Activity类似于Web...

    Android Service与Activity交互

    本示例"Android Service与Activity交互"旨在演示如何在Service启动后,通过线程进行异步操作,并在完成特定任务后,通过发送广播(Broadcast)通知Activity来更新用户界面。 首先,我们需要创建一个Service,通常在...

    android多个activity和一个service通信

    Activity代表用户界面,而Service则用于在后台执行长时间运行的任务,不直接与用户交互。在实际项目中,常常需要多个Activity与一个Service进行通信,比如本例中提到的“service在后台下载”场景。这种通信机制对于...

    activity和service的交互

    Activity作为用户界面的主要载体,负责与用户进行交互;而Service则用于在后台执行长时间运行的操作,即使用户离开应用也能继续运行。本文将深入探讨如何通过动态注册广播(BroadcastReceiver)来实现Activity和...

    Service向Activity传值(kotlin)

    在某些场景下,我们可能需要Service与Activity之间进行数据传递,例如本例中的“Service向Activity传值,实现Count累加的效果。定时传值”。这种需求常见于实时更新UI或者进行后台计数等操作。 首先,我们来详细...

    android Service Activity三种交互方式(付源码)

    这篇文章将详细介绍Service与Activity之间的三种交互方式,并提供相关的源码示例。 首先,我们来看第一种交互方式:通过Intent进行通信。Intent是Android系统中的一个核心类,它用于在组件之间传递消息。当你在...

    Activity和Service生命周期及使用AIDL通信实例备份

    启动Service只执行一次onStartCommand(),而绑定Service允许客户端通过IBinder接口与Service交互。理解何时使用启动或绑定Service是优化应用的关键,因为启动Service在后台持续运行,可能导致资源浪费,而绑定...

    Android-Service与Activity传值

    `Service`用于在后台执行长时间运行的任务,而`Activity`则负责用户界面交互。在某些场景下,我们可能需要在`Service`和`Activity`之间传递数据,比如`Service`执行完一些操作后,将结果传递给`Activity`进行展示。...

    AIDL Demo源码实现Activity与Service进程间通信

    Service中的`onBind`方法返回实现了AIDL接口的Binder对象,这样其他进程就可以通过这个Binder与Service交互。示例代码如下: ```java public class AidlService extends Service { private IAidlService.Stub ...

    进程内Activity和service使用Binder通信代码备份

    4. 测试代码:压缩包中的`TestService`可能包含了对上述步骤的实现,可以运行这个测试服务来验证Activity与Service之间的Binder通信是否正常。确保在AndroidManifest.xml中注册了Service,并给予必要的权限。 总结...

    Activity和Service通过aidl交互(跨进程)

    下面我们将详细探讨如何通过AIDL让Activity和Service在不同的应用之间进行交互。 首先,AIDL是一种接口定义语言,它的主要作用是定义一个可以在不同进程间调用的接口。当我们创建一个AIDL文件时,实质上是在定义一...

    android Service 与Activity绑定

    - Activity的onServiceConnected()回调方法被调用,此时可以开始通过IBinder与Service交互。 4. **Service生命周期管理** 当所有绑定Activity都解绑后(unbindService()),Service可能并不会立即销毁,而是由...

    Activity与Service之间交互并播放歌曲的实现代码

    在Activity中与Service交互的过程如下: 1. 启动Service:通常通过`startService(Intent)`方法,Intent携带必要的参数(如歌曲路径等)传递给Service。 2. 绑定Service:使用`bindService(Intent, ...

    Activity和Service

    `startService()`适用于无须客户端交互的长期任务,`bindService()`适用于需要与Service频繁交互的情况。 5. **Service的创建与绑定原理**:Service的创建通常在AndroidManifest.xml中声明,然后通过`startService...

    浅谈Android Activity与Service的交互方式

    本文主要探讨了四种不同的方式来实现Activity与Service之间的交互,以实现特定的功能,例如更新下载进度。 首先,通过广播交互是一种常见的方法。Service在执行任务时,比如下载,可以创建一个BroadcastReceiver,...

Global site tag (gtag.js) - Google Analytics