说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Android开发中实现跨进程通讯的AIDL接口

HTML文档下载 WORD文档下载 PDF文档下载
在Android开发中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可

 

在Android开发中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢?  显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.
AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.
AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.
Android开发中实现跨进程通讯的具体步骤如下:
1、创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。 如: ITaskBinder.adil
package com.cmcc.demo;
import com.cmcc.demo.ITaskCallback;
interface ITaskBinder {
    boolean isTaskRunning();
    void stopRunningTask();
    void registerCallback(ITaskCallback cb);
    void unregisterCallback(ITaskCallback cb);
}
其中: ITaskCallback在文件ITaskCallback.aidl中定义:
package com.cmcc.demo;
interface ITaskCallback {
    void actionPerformed(int actionId);
}
注意: 理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类, 不过在Eclipse中,目前的ADT不支持Bundle做为参数, 据说用Ant编译可以, 我没做尝试.
2、Android开发中编译AIDL文件, 用Ant的话, 可能需要手动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.
3、在Java文件中, 实现AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.
ITaskBinder.aidl中接口的实现, 在MyService.java中接口以内嵌类的方式实现:
private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {
        public void stopRunningTask() {
            //@TODO
        }
        public boolean isTaskRunning() {
            //@TODO
            return false;
        }
        public void registerCallback(ITaskCallback cb) {
            if (cb != null) mCallbacks.register(cb);
        }
        public void unregisterCallback(ITaskCallback cb) {
            if (cb != null) mCallbacks.unregister(cb);
        }
};
在MyActivity.java中ITaskCallback.aidl接口实现:
private ITaskCallback mCallback = new ITaskCallback.Stub() {
        public void actionPerformed(int id) {
           //TODO
            printf("callback id=" + id);
        }
};
4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind ()方法来返回一个实现上述接口的类的实例。这个地方返回的mBinder,就是上面通过内嵌了定义的那个. (MyService.java)
    public IBinder onBind(Intent t) {
        printf("service on bind");
        return mBinder;
}
在Activity中, 可以通过Binder定义的接口, 来进行远程调用.
5、在服务器端回调客户端的函数. 前提是当客户端获取的IBinder接口的时候,要去注册回调函数, 只有这样, 服务器端才知道该调用那些函数在:MyService.java中:
    void callback(int val) {
        final int N = mCallbacks.beginBroadcast();
        for (int i=0; i<N; i++) {
            try {
                mCallbacks.getBroadcastItem(i).actionPerformed(val);
            } catch (RemoteException e) {
                // The RemoteCallbackList will take care of removing
                // the dead object for us.
            }
        }
        mCallbacks.finishBroadcast();
}
AIDL的创建方法:
AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:
1. 不需要import声明的简单Java编程语言类型(int,boolean等)
2. String, CharSequence不需要特殊声明 
3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型. 
((另外: 我没尝试Parcelables, 在Eclipse+ADT下编译不过, 或许以后会有所支持).
下面是AIDL语法: 
// 文件名: SomeClass.aidl 
// 文件可以有注释, 跟java的一样 
// 在package以前的注释, 将会被忽略. 
// 函数和变量以前的注释, 都会被加入到生产java代码中.package com.cmcc.demo; 
// import 引入语句import com.cmcc.demo.ITaskCallback;
interface ITaskBinder {
    //函数跟java一样, 可以有0到多个参数 ,可以有一个返回值
    boolean isTaskRunning();
    void stopRunningTask();   
    //参数可以是另外的一个aidl定义的接口
    void registerCallback(ITaskCallback cb);  
    void unregisterCallback(ITaskCallback cb);
    //参数可以是String, 可以用in表入输入类型, out表示输出类型.
    int getCustomerList(in String branch, out String[] customerList);
}
实现接口时有几个原则:
.抛出的异常不要返回给调用者. 跨进程抛异常处理是不可取的..IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。 也就是IPC调用会挂起应用程序导致界面失去响应. 这种情况应该考虑单起一个线程来处理..不能在AIDL接口中声明静态属性。IPC的调用步骤:
1. 声明一个接口类型的变量,该接口类型在.aidl文件中定义。 
2. 实现ServiceConnection。 
3. 调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.  
4. 在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service). 调用    YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。 
5. 调用接口中定义的方法。 你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。 
6. 断开连接,调用接口实例中的ApplicationContext.unbindService()
下面是Android开发中实现AIDL接口的整个程序:
1. ITaskCallback.aidl
package com.cmcc.demo;
interface ITaskCallback {
    void actionPerformed(int actionId);
}
2. ITaskBinder.aidl
package com.cmcc.demo;
import com.cmcc.demo.ITaskCallback;
interface ITaskBinder {
    boolean isTaskRunning();
    void stopRunningTask();   
    void registerCallback(ITaskCallback cb);   
    void unregisterCallback(ITaskCallback cb);
}
3.  MyService.java
package com.cmcc.demo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.Log;
public class MyService extends Service {
    @Override
    public void onCreate() {
        printf("service create");
    }
    @Override
    public void onStart(Intent intent, int startId) {
        printf("service start id=" + startId);
        callback(startId);
    }
    @Override
    public IBinder onBind(Intent t) {
        printf("service on bind");
        return mBinder;
    }
    @Override
    public void onDestroy() {
        printf("service on destroy");
        super.onDestroy();
    }
    @Override
    public boolean onUnbind(Intent intent) {
        printf("service on unbind");
        return super.onUnbind(intent);
    }
    public void onRebind(Intent intent) {
        printf("service on rebind");
        super.onRebind(intent);
    }
    private void printf(String str) {
        Log.e("TAG", "###################------ " + str + "------");
    }
    void callback(int val) {
        final int N = mCallbacks.beginBroadcast();
        for (int i=0; i<N; i++) {
            try {
                mCallbacks.getBroadcastItem(i).actionPerformed(val);
            } catch (RemoteException e) {
                // The RemoteCallbackList will take care of removing
                // the dead object for us.
            }
        }
        mCallbacks.finishBroadcast();
    }
    private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {
        public void stopRunningTask() {
        }
        public boolean isTaskRunning() {
            return false;
        }
        public void registerCallback(ITaskCallback cb) {
            if (cb != null) mCallbacks.register(cb);
        }
        public void unregisterCallback(ITaskCallback cb) {
            if (cb != null) mCallbacks.unregister(cb);
        }
    };
   
    final RemoteCallbackList<ITaskCallback> mCallbacks
        = new RemoteCallbackList<ITaskCallback>();
}
4. MyActivity.java
package com.cmcc.demo;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.Color;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AbsoluteLayout;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.PrintWriter;
public class MyActivity extends Activity {
   
    private Button btnOk;
    private Button btnCancel;
   
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.test_service);
        btnOk = (Button)findViewById(R.id.btn_ok);
        btnCancel = (Button)findViewById(R.id.btn_cancel);
        btnOk.setText("Start Service");
        btnCancel.setTag("Stop Service");
        btnOk.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
                onOkClick();
            }
        });
        btnCancel.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                onCancelClick();
            }
        });
    }
    void onOkClick() {
        Bundle args = new Bundle();       
        Intent intent = new Intent(this, MyService.class);
        intent.putExtras(args);  
        //printf("send intent to start");
        //startService(intent);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        startService(intent);
    }
    void onCancelClick() {
        Intent intent = new Intent(this, MyService.class);
        //printf("send intent to stop");
        unbindService(mConnection);
        //stopService(intent);
    }
    private void printf(String str) {
        Log.e("TAG", "###################------ " + str + "------");
    }
    ITaskBinder mService;
    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className,
                IBinder service) {
            mService = ITaskBinder.Stub.asInterface(service);
            try {
                mService.registerCallback(mCallback);
            } catch (RemoteException e) {
            }
        }
        public void onServiceDisconnected(ComponentName className) {
            mService = null;
        }
    };
    private ITaskCallback mCallback = new ITaskCallback.Stub() {
        public void actionPerformed(int id) {
            printf("callback id=" + id);
        }
    };
}

作者:sdhjob

 

在Android开发中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢?  显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.

AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.

AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.

Android开发中实现跨进程通讯的具体步骤如下:

 

1、创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。 如: ITaskBinder.adil

 

package com.cmcc.demo;

 

import com.cmcc.demo.ITaskCallback;

 

interface ITaskBinder {

    boolean isTaskRunning();

    void stopRunningTask();

    void registerCallback(ITaskCallback cb);

    void unregisterCallback(ITaskCallback cb);

}

 

其中: ITaskCallback在文件ITaskCallback.aidl中定义:

 

package com.cmcc.demo;

interface ITaskCallback {

    void actionPerformed(int actionId);

}

 

注意: 理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类, 不过在Eclipse中,目前的ADT不支持Bundle做为参数, 据说用Ant编译可以, 我没做尝试.

 

2、Android开发中编译AIDL文件, 用Ant的话, 可能需要手动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.

 

3、在Java文件中, 实现AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.

 

ITaskBinder.aidl中接口的实现, 在MyService.java中接口以内嵌类的方式实现:

 

private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {

        public void stopRunningTask() {

            //@TODO

        }

 

        public boolean isTaskRunning() {

            //@TODO

            return false;

        }

 

        public void registerCallback(ITaskCallback cb) {

            if (cb != null) mCallbacks.register(cb);

        }

 

        public void unregisterCallback(ITaskCallback cb) {

            if (cb != null) mCallbacks.unregister(cb);

        }

};

 

在MyActivity.java中ITaskCallback.aidl接口实现:

 

private ITaskCallback mCallback = new ITaskCallback.Stub() {

        public void actionPerformed(int id) {

           //TODO

            printf("callback id=" + id);

        }

};

 

4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind ()方法来返回一个实现上述接口的类的实例。这个地方返回的mBinder,就是上面通过内嵌了定义的那个. (MyService.java)

 

    public IBinder onBind(Intent t) {

        printf("service on bind");

        return mBinder;

}

 

在Activity中, 可以通过Binder定义的接口, 来进行远程调用.

 

5、在服务器端回调客户端的函数. 前提是当客户端获取的IBinder接口的时候,要去注册回调函数, 只有这样, 服务器端才知道该调用那些函数在:MyService.java中:

 

    void callback(int val) {

        final int N = mCallbacks.beginBroadcast();

        for (int i=0; i<N; i++) {

            try {

                mCallbacks.getBroadcastItem(i).actionPerformed(val);

            } catch (RemoteException e) {

                // The RemoteCallbackList will take care of removing

                // the dead object for us.

            }

        }

        mCallbacks.finishBroadcast();

}

 

AIDL的创建方法:

 

AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:

 

1. 不需要import声明的简单Java编程语言类型(int,boolean等)

 

2. String, CharSequence不需要特殊声明 

3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型. 

((另外: 我没尝试Parcelables, 在Eclipse+ADT下编译不过, 或许以后会有所支持).

下面是AIDL语法: 

// 文件名: SomeClass.aidl 

// 文件可以有注释, 跟java的一样 

// 在package以前的注释, 将会被忽略. 

// 函数和变量以前的注释, 都会被加入到生产java代码中.package com.cmcc.demo; 

// import 引入语句import com.cmcc.demo.ITaskCallback;

 

interface ITaskBinder {

    //函数跟java一样, 可以有0到多个参数 ,可以有一个返回值

 

    boolean isTaskRunning();

    void stopRunningTask();   

 

    //参数可以是另外的一个aidl定义的接口

    void registerCallback(ITaskCallback cb);  

 

    void unregisterCallback(ITaskCallback cb);

 

    //参数可以是String, 可以用in表入输入类型, out表示输出类型.

 

    int getCustomerList(in String branch, out String[] customerList);

 

}

实现接口时有几个原则:

 

.抛出的异常不要返回给调用者. 跨进程抛异常处理是不可取的..IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。 也就是IPC调用会挂起应用程序导致界面失去响应. 这种情况应该考虑单起一个线程来处理..不能在AIDL接口中声明静态属性。IPC的调用步骤:

 

1. 声明一个接口类型的变量,该接口类型在.aidl文件中定义。 

2. 实现ServiceConnection。 

3. 调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.  

4. 在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service). 调用    YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。 

5. 调用接口中定义的方法。 你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。 

6. 断开连接,调用接口实例中的ApplicationContext.unbindService()

 

下面是Android开发中实现AIDL接口的整个程序:

 

1. ITaskCallback.aidl

 

package com.cmcc.demo;

interface ITaskCallback {

    void actionPerformed(int actionId);

}

 

2. ITaskBinder.aidl

package com.cmcc.demo;

import com.cmcc.demo.ITaskCallback;

interface ITaskBinder {

    boolean isTaskRunning();

    void stopRunningTask();   

    void registerCallback(ITaskCallback cb);   

    void unregisterCallback(ITaskCallback cb);

}

 

3.  MyService.java

 

package com.cmcc.demo;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteCallbackList;

import android.os.RemoteException;

import android.util.Log;

public class MyService extends Service {

    @Override

    public void onCreate() {

        printf("service create");

    }

    @Override

    public void onStart(Intent intent, int startId) {

        printf("service start id=" + startId);

        callback(startId);

    }

 

    @Override

    public IBinder onBind(Intent t) {

        printf("service on bind");

        return mBinder;

    }

 

    @Override

    public void onDestroy() {

        printf("service on destroy");

        super.onDestroy();

    }

 

    @Override

 

    public boolean onUnbind(Intent intent) {

        printf("service on unbind");

        return super.onUnbind(intent);

    }

 

    public void onRebind(Intent intent) {

        printf("service on rebind");

        super.onRebind(intent);

    }

 

    private void printf(String str) {

        Log.e("TAG", "###################------ " + str + "------");

    }

 

    void callback(int val) {

        final int N = mCallbacks.beginBroadcast();

        for (int i=0; i<N; i++) {

            try {

                mCallbacks.getBroadcastItem(i).actionPerformed(val);

            } catch (RemoteException e) {

                // The RemoteCallbackList will take care of removing

                // the dead object for us.

            }

        }

        mCallbacks.finishBroadcast();

    }

 

    private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {

        public void stopRunningTask() {

        }

 

        public boolean isTaskRunning() {

            return false;

        }

 

        public void registerCallback(ITaskCallback cb) {

            if (cb != null) mCallbacks.register(cb);

        }

 

        public void unregisterCallback(ITaskCallback cb) {

            if (cb != null) mCallbacks.unregister(cb);

        }

    };

 

 

 

    final RemoteCallbackList<ITaskCallback> mCallbacks

        = new RemoteCallbackList<ITaskCallback>();

 

}

 

4. MyActivity.java

 

package com.cmcc.demo;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.graphics.Color;

import android.os.Bundle;

import android.os.IBinder;

import android.os.RemoteException;

import android.util.Log;

import android.view.View;

import android.view.ViewGroup;

import android.view.View.OnClickListener;

import android.widget.AbsoluteLayout;

import android.widget.Button;

import android.widget.LinearLayout;

import android.widget.RelativeLayout;

import android.widget.TextView;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.PrintWriter;

 

public class MyActivity extends Activity {

 

 

    private Button btnOk;

    private Button btnCancel;

 

    @Override

 

    public void onCreate(Bundle icicle) {

        super.onCreate(icicle);

        setContentView(R.layout.test_service);

        btnOk = (Button)findViewById(R.id.btn_ok);

        btnCancel = (Button)findViewById(R.id.btn_cancel);

        btnOk.setText("Start Service");

        btnCancel.setTag("Stop Service");

        btnOk.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {

                onOkClick();

            }

        });

 

        btnCancel.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                onCancelClick();

            }

        });

    }

 

    void onOkClick() {

        Bundle args = new Bundle();       

        Intent intent = new Intent(this, MyService.class);

        intent.putExtras(args);  

        //printf("send intent to start");

        //startService(intent);

        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

        startService(intent);

    }

 

    void onCancelClick() {

        Intent intent = new Intent(this, MyService.class);

        //printf("send intent to stop");

 

        unbindService(mConnection);

        //stopService(intent);

    }

 

    private void printf(String str) {

        Log.e("TAG", "###################------ " + str + "------");

    }

 

    ITaskBinder mService;

 

    private ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className,

                IBinder service) {

            mService = ITaskBinder.Stub.asInterface(service);

            try {

                mService.registerCallback(mCallback);

            } catch (RemoteException e) {

            }

        }

 

        public void onServiceDisconnected(ComponentName className) {

            mService = null;

        }

    };

 

    private ITaskCallback mCallback = new ITaskCallback.Stub() {

        public void actionPerformed(int id) {

            printf("callback id=" + id);

        }

    };

}

 

来源:http://blog.csdn.net/sdhjob

 

兄贵草泥马:重口味单机移动游戏为什么能火? 最炫HTML5框架Famo.us 将免费面向开发者 MySQL到NoSQL:数据的重思和查询方式的转换 程序员心髓:移动应用API设计10大技巧 Netflix公布个性化和推荐系统架构,3种类型作业通实时 从SendCloud到搜狐云 扎克伯格的败笔?Facebook Home可能无家可归 走进eico design,仰视设计师 乔布斯顾问承认苹果的命名糟透了 罗永浩:一百万年薪!招聘软件研发总监 开源的:helios移动应用后端服务框架 IE11将支持WebGL 或将OpenGL映射到DirectX 基于云端的3D渲染和协作平台Lagoa:仅需一个浏览器 大数据提速,IBM 推面向Hadoop的PureData大数据机 游戏开发者的盛宴:2013 CocoaChina春季开发者大会强势启动 开放还是关闭API?CIO做决策前应考虑的六个建议 Python 2.7.4发布,更快的IO模块 如何拒绝沦为服务的商品,并收回对数据的绝对掌控 最阴险的代码?尽在“邪恶”的Underhanded C Facebook Home出阴招:Social皮,Android心 国内最火的五款HTML5前端开发框架 TIOBE 2013年4月编程语言排行榜:Objective-C四年来排名首次下滑 MeeGo复活!Sailfish OS智能手机 SDK发布 10亿美金!传闻谷歌要收购WhatsApp 从打造国内最大的OpenStack公有云开始 展望HBase的未来 你的数据库安全吗?CryptDB数据库软件可查询加密的SQL数据库 收藏!斯坦福Andrew Ng教授“机器学习”26篇教程全译 美国云计算价格战爆发 王寒:12岁儿童,该怎样开始iOS开发? 陈昊芝:腾讯!让我说你什么好? 急,为什么我的数据库会出现这样的错误? 寻求一个好的全屏翻译软件(在线等候,在线给分) 寻找《编译原理与时间》电子文档下载url 升级了,散分小庆.认识的朋友进来捧个场,不认识的也进来热闹热闹!忠心感谢:-) 奇怪的问题 如何解决在一个表单中多个提交按钮的问题? 请问怎样关闭135端口 Photoshop7.0的一个简单问题,大师们帮帮忙! 关于动态查询的问题? 请问如何验证代理服务器? 超过半个小时不作任何操作就把这个连接KILL掉,改如何做呢? 如何才能做出只存在于托盘栏的程序! 搜集VB绘图源代码,多多益善 北京市里有没有支持asp.net的服务器空间提供吗? GGJJDDMM 帮帮我啊~~~~ 新手的问题--如何作到点击页面中的提交按钮,只刷该页面的DataGrid部分,而其它部分控件值不变?(在线给分) 大家帮忙,要取得客户端的信任,用服务器控件对客户端进行读写文件的资料? 谁说我们要和兄弟会和解了? 一直都是你们在攻击我们,靠还和解?道歉差不多。 版本的差异造成的问题,ADO连接SQL Server。求教!!! 海宜派(NSU Pie) 为什么insert into语句不能完成添加? 在线等一个简单的问题! 能用DOS盘启动然后用GHOST 备分LINUX分区吗?我想备份我的LINUX系统。 SQL中能否用CopyMemory这样的函数??? 我的猫竟拨不上号 一个菜问题 type和typedef有什么区别? 100分问题,在线等,本地XSL,XML,使用VB脚本,使用MSChart生成图形,刷新几次后IE崩溃,高分求解 socket.setSoTimeout() BCB使用ClientDataSet调用Sybase存储过程的问题 趟过“地雷阵”的铁面总理 (转载) 我的电脑为何会自动开机? emf是什么打印格式? 小偷 请问我以后删贴、结贴是不是要先向EA、ginger、大师申请? 如何实现这种查询?急!!!! 高分求救:Dos下控制(HP等)打印机打印汉字的编程,请各位帮帮我好吗? 能否将下面的代码简化呢?? 请大家给介绍几本C++学习的入门书籍,好吗? type和typedef有什么区别? 本人姓刘,现在正在给自己的孩子起名,希望大家多多帮忙! 大力好~~~~~~~~~~~~~~ 如何用数组操作的方法对控件组操作? 谁有需求分析文档?明天结帖。 各位大哥,有没有网络监控方面的控件,小弟有急用。 免费空间广告去除~! Delphi对文件的操作 简单的问题,先解决先给分了 后台服务加载,在线等待,高分求解! 帮助解决 硬盘文件系统报错 三面投影图中,形体投影规律为____,____,____. 《昆虫记》的读后感与读书心得 内蒙语 祝:你幸福怎么说 例句:海上的夜是柔和的,是静寂的,是梦幻的.城市的夜是…… 早晨的雾是…… 先天下之忧而忧的下一句 鸟卵细胞中,能进行胚胎发育的是A.卵白B.卵黄C.卵壳膜D.胚盘 迈达斯中选择 5to222by54 是什么意思 怎么样来计算配煤的配比呢?感谢各位的帮助~! 昆虫记读书笔记(要好句和读后感,不要别的)记住,只要好句和读后感,不要主要内容, 关于下丘脑功能的叙述 正确的事①可参与血糖平衡的调节 ②有调节躯体运动的高级中枢 ③可合成和分泌促甲状腺激素释放激素 ④垂体通过下丘脑控制性腺的生长发育A.①②B.②③C. 1投影的形成需要哪些要素?2.平行正投影有哪些基本性质?3.土木工程上常用的投影图有哪些? 什么化学剂或药剂能破除蛋白质由于一种油水液体因温度过高导致里面生成蛋白,现在我想让这些蛋白消失,希望大家给个答复我!谢谢,请大家帮帮忙!本人万分感谢 自然光在玻璃、水面、木质桌面等表面反射时,反射光和折射光都是偏振光,为什么,我就是理解不了,还反射光折射光,这都没有通过偏振片啊.当我们直接观察、拍摄橱窗、水中的物体时,有些时 一个有关桥的故事 先天下之忧而忧,的下一句 迈达斯定义结构组的时候为什么选择不到单元?不管怎么选择都是“节点数=0,单元数=0'. 高中生物神经调节这个知识点怎么提高 哪些试剂可以除去蛋白质中的脂 迈达斯FEA和CIVIL区别 具体说下 怎么感觉不出来? 这两个词的意思? 我喜欢你里约热内卢语怎么写? 下丘脑的功能下丘脑控制哪些功能 谁可以给我初二上的生物各章知识点啊?生物老师给我布置了一项寒假作业,让我把初二上学期的生物各章知识点归纳一下, 蒙古语我喜欢你的写法不要拼音要确切的怎么写就是能贴图的最好贴图那种长得像钥匙一样的文字(咳咳,不好意思,那文字被我形容成那样了)恩我邮箱834077646@qq .com恩.发给我吧.给了讲一声 为什么感觉迈达斯之手很少有人出呢?除了可以加快攻速啊 很适合DPS的过度啊 难道是我玩的太少了? 闻一多先生说了什么做了什么? 广东语我喜欢你怎么说? 为什么自然光经过介质反射后可以成为偏振光?请介绍一下其中的原理, "先天下之忧而忧"下句是什么? 谁知道珍珠鸟的结构图啊? 做脂质体用什么显微镜比较好 先天下之忧而忧的下一句是什么?如题! 鸟卵结构图,据图回答 《生日感慨》作文怎么写 只说 方法就可以 先天下之忧而忧,下一句是什么? 我要小鸟的素描结构图,有没有?什么鸟都可以 如何给自己写生日感言 先天下之忧而忧,的下一句是什么? 我的孩子抄作业都能抄错怎么办?是不是小孩子都是注意力不集中啊,这样要怎么解决啊,要慢慢引导吗?还是有什么课程可以纠正的? 求迈达斯软件的用法有没有迈达斯软件的电子书教程? 闻一多先生 说与做有何特点 抄作业的好处关于辨论会的,全面一点 迈达斯分配功能如何使用 上联是:先天下之忧而忧忧得其所 求下联、拜托了、 能不能抄作业! 例句:海上的夜市柔和的,是静寂的,是梦幻的依照例句的格式各造一句乡村的夜( )城市的夜( ) 先天下之忧而忧的下句是? "先天下之忧而忧"后半句是什么? 例句 海上的夜是柔和的,是寂静的,是梦幻的.仿照例句,选择一个事物造句 问一下感慨历史沧桑无常的诗句像“人生天地间,忽如远行客”这样的 先天下之忧而忧的后半句 我爱你你爱我吗?你嫁给我好吗?越南语怎么写 英语翻译 先天下之忧而忧,后一句是什么? 大气压强减小液体沸点减小你们那么固体的呢? 关于桥的谚语故事传说多点 先天下之忧而忧的后一句 电大建筑制图基础形成性考核 根据所给形体的三面投影,绘制形体的正等轴测图? 歇后语里的故事名称( )——自欺欺人( )——巧用天时( )——颠倒是非古代文人勤奋读书的故事很多,流传甚广得有( )( )(写成语) 蛋白质的化学试剂可以吃吗? 尼泊尔发生180多起“反选举”暴力活李克强:改革已进深水区 必须敢于打破伊朗最高领袖对核谈“不乐观”国际晚班车:外交官的家庭生活国际财经一周大事回顾中国上市公司三季报业绩再涨 四季度增朴槿惠:日本应向德国学习正视历史错误世界主要城市11月4日天气预报萨耶赫:“非洲要重返经济危机前高速发浙江普陀山大型翡翠观音宝像开雕载70人船只在缅甸海域倾覆 已找到8美共和党议员称国安局或监听奥巴马电话朴槿惠:日本应向德国学习正视历史错误美军士兵与怀孕妻子视频聊天目睹其被歹载70人船只在缅甸海域倾覆 已找到8伊朗最高领袖称支持伊核问题会谈 对前快讯:载70人船只在缅甸海域倾覆 已美无人机再清除巴塔首领 和谈生变惹怒英国一医院医疗过失误诊流产 恐致死逾英国一医院医疗过失误诊流产 恐致死逾伊朗最高领袖称支持伊核问题会谈 对前少女时代CNBLUE众星亮相时尚秀(金正恩新一轮“求关注”未奏效 或对韩美智库:朝鲜宁边核反应堆出问题 正在美学校因30多名师生过敏全员撤离 祸美国大兵在日本救灾遭核辐射患癌 集体学生明天撤离“立院”台北出动1600269家世界500强企业落户 外资看台南商家在蟋蟀身上粘饰品 被批虐待动台各方提7版两岸协议监督条例 马英九少年背包被偷好着急 称内有20万中奖博士生疑因压力大自杀 书桌留有“死”台湾反服贸学生代表保镖曝光 全副武装台湾中华统促党魁或再赴议场 与学生“胸型忽高忽低? 女毒贩内衣藏毒被识破谎称可安排与周杰伦见面 男子骗精神障设“拉筋座椅” 新北双溪打造慢跑天堂国民党恐失年轻世代选票?党内看法不一台湾小学生街头叫卖西红柿 为患癌父亲台湾花莲发生多起毒狗事件 警方介入全女子以发生关系抵债 反偷拍男子暴露照遭路人打瞎眼睛 导盲犬法庭聆判成台湾
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘