Android中的跨进程回调

标签: android 进程 回调 | 发表时间:2013-03-01 16:30 | 作者:jcgu
出处:http://blog.csdn.net

在Android应用程序开发中,可能会遇到跨进程回调问题,比如,调用一个服务,但服务是异步的,服务完成后,需要给客户一个通知,这时就需要用到跨进程回调了。跨进程回调本质上用到了Binder机制,其过程如下: 

1.定义aidl

ITest.aidl

package com.example.chirpdemo;
import com.example.chirpdemo.ITestListener;

interface ITest {
int getValue();
void setValue(int value);
void listen(ITestListener listener);
}

ITestListener.aidl

package com.example.chirpdemo;

interface ITestListener {
void onFinished(int result);
}

2.Service定义如下:

package com.example.chirpdemo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class MyService extends Service {
    final private static String TAG = "MyService";

    public class ServiceImpl extends ITest.Stub {
        private int mValue;
        private ITestListener mListener;

        public ServiceImpl() {
            mValue = 0;
        }

        @Override
        public int getValue() throws RemoteException {
            return mValue;
        }

        @Override
        public void setValue(int value) throws RemoteException {
            mValue = value;

            if (null != mListener) {
                mListener.onFinished(-1);
            }
        }

        @Override
        public void listen(ITestListener listener) throws RemoteException {
            mListener = listener;
        }
    }

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

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

    @Override
    public void onStart(Intent intent, int startId) {
        Log.d(TAG, "onStart");
        super.onStart(intent, startId);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

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

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

    @Override
    public IBinder onBind(Intent arg0) {
        return new ServiceImpl();
    }

}

3.Client定义如下:

package com.example.easytabdemo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.example.chirpdemo.ITest;
import com.example.chirpdemo.ITestListener;
import com.example.easytabdemo.SlideTabHost.TabSpec;

public class MainActivity extends Activity {
    final private static String TAG = "MainActivity";
        
    final Intent myIntent = new Intent("com.pyk.les.IlongExistService");
    private boolean startedService = false;
    private ITest leservice = null;
    ServiceConnection myServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            leservice = ITest.Stub.asInterface(service);
            
            try {
                leservice.listen(new ITestListener.Stub() {

                    @Override
                    public void onFinished(int result) throws RemoteException {
                    }
                    
                });
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            leservice = null;
            Log.i("aaaaaaaaaaaa", "onDisconnected:" + Thread.currentThread());
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        startedService = bindService(new Intent("com.my.IService"),
                myServiceConnection, BIND_AUTO_CREATE);
        Log.i("aaaaaaaaaaaa", "bindService:" + Thread.currentThread());
        
        Button bt = (Button)this.findViewById(R.id.bt1);
        bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                if ( startedService ) {
                    if ( null != leservice ) {
                        try {
                            leservice.setValue(leservice.getValue() + 1);
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
        
        view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                if ( startedService ) {
                    if ( null != leservice ) {
                        try {
                            mEditText.setText(leservice.getValue() + "");
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.i("aaaaaaaa", "onStart");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.i("aaaaaaaa", "onPause");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.i("aaaaaaaa", "onResume");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.i("aaaaaaaa", "onStop");
    }

    @Override
    protected void onDestroy() {
        if (startedService) {
            unbindService(myServiceConnection);
        }
        Log.i(TAG, "onDestroy");
        super.onDestroy();
    }
}


在以上代码中ITestListener为跨进程回调接口

作者:jcgu 发表于2013-3-1 16:30:52 原文链接
阅读:48 评论:0 查看评论

相关 [android 进程 回调] 推荐:

Android中的跨进程回调

- - CSDN博客移动开发推荐文章
在Android应用程序开发中,可能会遇到跨进程回调问题,比如,调用一个服务,但服务是异步的,服务完成后,需要给客户一个通知,这时就需要用到跨进程回调了. 跨进程回调本质上用到了Binder机制,其过程如下:. 2.Service定义如下:. 在以上代码中ITestListener为跨进程回调接口.

android回调函数总结

- - Java - 编程语言 - ITeye博客
android回调函数总结. 回调函数就是那些自己写的,但是不是自己来调,而是给别人来掉的函数. 消息响应函数就可以看成是回调函数,因为是让系统在合适的时候去调用. 这不过消息响应函数就是为了处理消息的,. 但是回调函数不是只有消息响应函数一种,比如在内核编程中,驱动程序就要提供一些回调函数,. 当一个设备的数据读写完成后,让系统调用这些回调函数来执行一些后续工作.

Android 进程间通信

- - SegmentFault 最新的文章
单例居然失效了,一个地方设置值,另个地方居然取不到,这怎么可能. 排查半天,发现这两就不在一个进程里,才恍然大悟……. 按照操作系统中的描述:进程一般指一个执行单元,在 PC 和移动设备上指一个程序或者一个应用. 我们都知道,系统为 APP 每个进程分配的内存是有限的,如果想获取更多内存分配,可以使用多进程,将一些看不见的服务、比较独立而又相当占用内存的功能运行在另外一个进程当中.

android跨进程通信(IPC):使用AIDL

- - CSDN博客移动开发推荐文章
AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码. 如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数.

android 进程间通信方式

- - 移动开发 - ITeye博客
由于android系统中应用程序之间不能共享内存. 因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些. 在android SDK中提供了4种用于跨进程通讯的方式. 这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service.

Android 进程回收之LowMemoryKiller原理篇

- - CSDN博客移动开发推荐文章
在前面的文章 Android进程保活一文中,对于LowMemoryKiller的概念做了简单的提及. LowMemoryKiller简称低内存杀死机制. 在讲解LowMemoryKiller之前,先看另一个概念:OOMKiller. Linux下有一种OOM KILLER 的机制,它会在系统内存耗尽的情况下,启用自己算法有选择性的kill 掉一些进程.

Android用户的一些误区――关于进程管理

- Jerry - cnBeta.COM
去年自己就弄了一台i5700,主要用来编程时候做试验平台(因为便宜). 今年6月给自己及父母各买了一台Android手机,自用DHD,老爸用的i9000,老妈用的Thunderbolt. 在进行了许多Android系统的了解及编程之后,发现其实无论是论坛上的用户还是家人使用的过程中,对于Android系统,特别是进程管理这一块都有着许多误区.

内存不足时Android 系统如何Kill进程

- - 移动开发 - ITeye博客
大家其实都或多或少知道,Android系统有自已的任务管理器,当系统内存不足时,系统需要KILL一些进程(应用),以回收一部分资源,来保证系统仍可以正常的运行,而不会崩溃,今天,就具体讲讲这个原理. 进程优先级(importance hierarchy). Android系统尽量保持进程运行的更久,但是仍有时候,需要结束掉老的进程,回收内存来保证新的,或更重要的进程运行.

Android WebView独立进程解决方案 - 简书

- -
App中大量Web页面的使用容易导致App内存占用巨大,存在内存泄露,崩溃率高等问题,WebView独立进程的使用是解决Android WebView相关问题的一个合理的方案. 为什么要采用WebView独立进程. Android WebView的问题. WebView导致的OOM问题. Android版本不同,采用了不同的内核,兼容性Crash.

Android用户的一些误区——关于进程管理_cnBeta 访客互动_cnBeta.COM

- 立寅 - www.cnbeta.com
去年自己就弄了一台i5700,主要用来编程时候做试验平台(因为便宜). 今年6月给自己及父母各买了一台Android手机,自用DHD,老爸用的i9000,老妈用的Thunderbolt. 在进行了许多Android系统的了解及编程之后,发现其实无论是论坛上的用户还是家人使用的过程中,对于Android系统,特别是进程管理这一块都有着许多误区.