Android中与外部进程通信和调用外部程序
16lz
2021-01-26
当一个程序第一次启动的时候,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目录下找到,现在就可以做你想做的事情了!
可以用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)的出口值
下面是一个我们经常会见到的例子,也是文档中描述的例子:
[java] view plain copy
- privatestaticvoidping()
- {
- Processprocess=null;
- try{
- process=newProcessBuilder()
- .command("ping","www.google.com")
- .redirectErrorStream(true)
- .start();
- InputStreamin=process.getInputStream();
- BufferedReaderbr=newBufferedReader(newInputStreamReader(in));
- Strings=null;
- while((s=br.readLine())!=null)
- {
- System.out.println(s);
- }
- }
- catch(IOExceptione)
- {
- 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目录下找到,现在就可以做你想做的事情了!
[java] view plain copy
- packagecom.linc.AndroidProcess;
- importjava.io.BufferedReader;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.InputStreamReader;
- importjava.io.OutputStream;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.util.Log;
- importandroid.widget.TextView;
- publicclassAndroidProcessextendsActivity{
- privateTextViewtext;
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- text=(TextView)findViewById(R.id.text);
- ping();
- }
- privatevoidping()
- {
- Processprocess=null;
- try{
- process=newProcessBuilder()
- //.command("/system/bin/ping","www.google.com")
- .command("/system/bin/date")
- //.command("/system/bin/ifconfig")
- .redirectErrorStream(true)
- .start();
- InputStreamin=process.getInputStream();
- OutputStreamout=process.getOutputStream();
- BufferedReaderbr=newBufferedReader(newInputStreamReader(in));
- Strings=null;
- while((s=br.readLine())!=null)
- {
- Log.d("AndroidProcessgetdate:",s);
- }
- }
- catch(IOExceptione)
- {
- e.printStackTrace(System.out);
- System.err.println("创建进程时出错");
- System.exit(1);
- }
- finally{
- process.destroy();
- }
- }
- }
另外,我也提到了如何调用外部程序。这里的外部程序指的是android系统中自带的程序如拍照、电话本啦,
可以用startActivity的方式来启动。如下面广为流传的例子:
[java] view plain copy
- publicvoidinvokeCamera(){
- IntentmIntent=newIntent();
- ComponentNamecomp=newComponentName("com.android.camera",
- "com.android.camera.Camera"
- );
- mIntent.setComponent(comp);
- mIntent.setAction("android.intent.action.VIEW");
- startActivity(mIntent);
- }
更多相关文章
- Android中persistent属性用法详解
- 秒懂Android(安卓)Studio的奇技淫巧
- 设置程序[置顶] android(10)_android权限大全
- Android开发艺术探索
- Android网页WebView图片文件上传的问题
- Android(安卓)View 事件分发机制详解
- android新特性: 底部导航栏BottomNavigationView系统库与第三方库
- Android基础(十) Service 服务
- android apk--程序发布前的准备