IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Android中与外部进程通信和调用外部程序

    lincyang发表于 2011-08-06 23:01:25
    love 0
    当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。之前我写过两篇关于进程的笔记,请看:http://blog.csdn.net/lincyang/article/details/5897080 和 http://blog.csdn.net/lincyang/article/details/6451813。

    在Java中执行外部程序,是通过java.lang.Runtime对象的exec()方法来完成的。Runtime中重载了6个exec方法,返回一个java.lang.Process对象实例。
    这个进程类主要功能是与外部进程通信的,看过API的同学也许已经看到了,android也提供了一个进程类,android.os.Process,这个类呢,文档上的Overview写道:Tools for managing OS processes,它是一个管理OS进程的工具,再看它的方法,提供了killProcess、sendSignal等等。
    我们再回过头来看java.lang.Process的方法:
    getInputStream():获取相关进程的输入流
    getOutputStream():获取相关进程的输出流
    waitFor ():等待外部进程执行完,返回进程的出口值
    exitValue ():返回本地进程(native process)的出口值

    下面是一个我们经常会见到的例子,也是文档中描述的例子:

    	private static void ping()
    	{
    		Process process=null;
    	   try {
    		   process = new ProcessBuilder()
    		   .command("ping", "www.google.com")
    		   .redirectErrorStream(true)
    		   .start();
    	     InputStream in = process.getInputStream();
    	     BufferedReader br = new BufferedReader(new InputStreamReader(in));
    	     String s = null;
    			while((s = br.readLine())!= null)
    			{
    				System.out.println(s);
    			}
    	   }
    		catch(IOException e)
    		{
    			e.printStackTrace(System.out);
    			System.err.println("创建进程时出错");
    			System.exit(1);
    		}
    	    finally {
    	     process.destroy();
    	   }
    	 }

    这段程序调用ping命令,并获取输入流打印出来。这里也用到了java.lang.ProcessBuilder来创建一个新的进程。
    又使用了command方法和start方法。
    那么,在android中也可以实现么?答案是当然可以。
    首先我们要知道的是,android系统中,ping命令的所在目录是system/bin下。
    而且,所有的linux命令大部分都可以在bin目录下找到,现在就可以做你想做的事情了!

    package com.linc.AndroidProcess;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    
    public class AndroidProcess extends Activity {
    	private TextView text;
    	
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            text = (TextView)findViewById(R.id.text);
            ping();
        }
        
        private void ping()
    	{
    		Process process=null;
    		try {
    			process = new ProcessBuilder()
    //			   .command("/system/bin/ping", "www.google.com")
    				.command("/system/bin/date")
    //			.command("/system/bin/ifconfig")
    			   .redirectErrorStream(true)
    			   .start();
    	     InputStream in = process.getInputStream();
    	     OutputStream out = process.getOutputStream();
    	     BufferedReader br = new BufferedReader(new InputStreamReader(in));
    	     String s = null;
    			while((s = br.readLine())!= null)
    			{
    				Log.d("AndroidProcess get date: ", s);
    			}
    	   }
    		catch(IOException e)
    		{
    			e.printStackTrace(System.out);
    			System.err.println("创建进程时出错");
    			System.exit(1);
    		}
    	    finally {
    	     process.destroy();
    	   }
    	 }
        
        
    
    }

    另外,我也提到了如何调用外部程序。这里的外部程序指的是android系统中自带的程序如拍照、电话本啦,
    可以用startActivity的方式来启动。如下面广为流传的例子:

        public void invokeCamera() {
        	  Intent mIntent = new Intent();
        	  ComponentName comp = new ComponentName("com.android.camera",
        	    "com.android.camera.Camera"
        	  );
        	  mIntent.setComponent(comp);
        	  mIntent.setAction("android.intent.action.VIEW");
        	  startActivity(mIntent);
        	}
    这里用到了android.content.ComponentName类,它有4个构造函数,这里用的是“包名+类名“为参数。



沪ICP备19023445号-2号
友情链接