当一个程序第一次启动的时候,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)的出口值

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

[java] view plain copy
  1. privatestaticvoidping()
  2. {
  3. Processprocess=null;
  4. try{
  5. process=newProcessBuilder()
  6. .command("ping","www.google.com")
  7. .redirectErrorStream(true)
  8. .start();
  9. InputStreamin=process.getInputStream();
  10. BufferedReaderbr=newBufferedReader(newInputStreamReader(in));
  11. Strings=null;
  12. while((s=br.readLine())!=null)
  13. {
  14. System.out.println(s);
  15. }
  16. }
  17. catch(IOExceptione)
  18. {
  19. e.printStackTrace(System.out);
  20. System.err.println("创建进程时出错");
  21. System.exit(1);
  22. }
  23. finally{
  24. process.destroy();
  25. }
  26. }

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

[java] view plain copy
  1. packagecom.linc.AndroidProcess;
  2. importjava.io.BufferedReader;
  3. importjava.io.IOException;
  4. importjava.io.InputStream;
  5. importjava.io.InputStreamReader;
  6. importjava.io.OutputStream;
  7. importandroid.app.Activity;
  8. importandroid.os.Bundle;
  9. importandroid.util.Log;
  10. importandroid.widget.TextView;
  11. publicclassAndroidProcessextendsActivity{
  12. privateTextViewtext;
  13. /**Calledwhentheactivityisfirstcreated.*/
  14. @Override
  15. publicvoidonCreate(BundlesavedInstanceState){
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.main);
  18. text=(TextView)findViewById(R.id.text);
  19. ping();
  20. }
  21. privatevoidping()
  22. {
  23. Processprocess=null;
  24. try{
  25. process=newProcessBuilder()
  26. //.command("/system/bin/ping","www.google.com")
  27. .command("/system/bin/date")
  28. //.command("/system/bin/ifconfig")
  29. .redirectErrorStream(true)
  30. .start();
  31. InputStreamin=process.getInputStream();
  32. OutputStreamout=process.getOutputStream();
  33. BufferedReaderbr=newBufferedReader(newInputStreamReader(in));
  34. Strings=null;
  35. while((s=br.readLine())!=null)
  36. {
  37. Log.d("AndroidProcessgetdate:",s);
  38. }
  39. }
  40. catch(IOExceptione)
  41. {
  42. e.printStackTrace(System.out);
  43. System.err.println("创建进程时出错");
  44. System.exit(1);
  45. }
  46. finally{
  47. process.destroy();
  48. }
  49. }
  50. }

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

[java] view plain copy
  1. publicvoidinvokeCamera(){
  2. IntentmIntent=newIntent();
  3. ComponentNamecomp=newComponentName("com.android.camera",
  4. "com.android.camera.Camera"
  5. );
  6. mIntent.setComponent(comp);
  7. mIntent.setAction("android.intent.action.VIEW");
  8. startActivity(mIntent);
  9. }
这里用到了android.content.ComponentName类,它有4个构造函数,这里用的是“包名+类名“为参数。

更多相关文章

  1. Android中persistent属性用法详解
  2. 秒懂Android(安卓)Studio的奇技淫巧
  3. 设置程序[置顶] android(10)_android权限大全
  4. Android开发艺术探索
  5. Android网页WebView图片文件上传的问题
  6. Android(安卓)View 事件分发机制详解
  7. android新特性: 底部导航栏BottomNavigationView系统库与第三方库
  8. Android基础(十) Service 服务
  9. android apk--程序发布前的准备

随机推荐

  1. android dumpsys
  2. 设置控件不可点击
  3. Android工作笔记:Android路径大全
  4. Android常用控件
  5. 热门资讯 | 蓝鸥Android开发培训再现开发
  6. 样式和主题-style&them
  7. Android7.0中文文档(API)-- Toast
  8. Android下修改ImageButton样式
  9. 解决Could not find manifest-merger.jar
  10. 如何进行Android单元测试