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

52 篇文章 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个构造函数,这里用的是“包名+类名“为参数。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值