当一个程序第一次启动的时候,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)的出口值
这段程序调用ping命令,并获取输入流打印出来。这里也用到了java.lang.ProcessBuilder来创建一个新的进程。
又使用了command方法和start方法。
那么,在android中也可以实现么?答案是当然可以。
首先我们要知道的是,android系统中,ping命令的所在目录是system/bin下。
而且,所有的linux命令大部分都可以在bin目录下找到,现在就可以做你想做的事情了!
另外,我也提到了如何调用外部程序。这里的外部程序指的是android系统中自带的程序如拍照、电话本啦,
可以用startActivity的方式来启动。如下面广为流传的例子:
在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个构造函数,这里用的是“包名+类名“为参数。