zxing安卓项目学习1——AndroidManifest文件

来源:互联网 发布:珠宝首饰设计软件 国际 编辑:程序博客网 时间:2024/05/21 01:44

初学安卓,想了解一个完整的APP是怎么做出来。发现谷歌zxing中有一个安卓的开源项目,我打算学习这个项目,学习这个项目中所涉及的一系列知识。

我下载的是zxing2.1的源码,导入eclipse后能在我的手机上运行。

看安卓项目当然先看AndroidManifest

 

AndroidManifest中首先声明了一些必须的权限

1     <uses-permission/> //权限标签

---------------------------------------------------------------------------------------------

权限标签下面是:

2    <uses-feature/>       

我理解的是:APP市场能够通过此标签过滤要显示给用户的应用程序,因此用户只能看到和下载那些跟他们的设备兼容的应用程序。通过功能的兼容性来过滤应用程序是这个方法之一。

(参考:(http://blog.csdn.net/think_soft/article/details/7596796))

我做了个测试:因为我的手机没有闪光灯,所以我将文件中:

<uses-featureandroid:name="android.hardware.camera.flash"android:required="false"/>

android:required  改为  true

(true表示:在设备上不存在指定的功能时,则该应用不能够正常运行。)

但是我依然可以在手机上运行,也就是说,程序不管这个标签的声明情况。也就是说这个标签只是用来被应用市场对APP进行过滤时所用到。

------------------------------------------------------------------------------------------------------------------------------------

 3<intent-filter>

关于这个标签需要了解两个信息

(1) 显示intent 与隐式 intent 可以参考:http://tompig.iteye.com/blog/1096603

(2) intent 和 intent-filter之间的关系 ,可以参考http://www.blogjava.net/TiGERTiAN/archive/2010/02/03/311827.html

对于intent-filter我看了好久都没明白讲的是啥,后来写了个例子就明白了。

新建安卓工程并将AndroidManife.xml文件中的<application>改为

<application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.tian.intentfilter.IntentFilterActivity"            android:label="@string/app_name" >             <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>                    </activity>                <activity            android:name="com.tian.androidsqlite.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.Tian" />                <category android:name="android.intent.category.Tian" /> <category android:name="android.intent.category.DEFAULT"/>                            </intent-filter>        </activity>                 <activity            android:name="com.tian.intentfilter.IntentActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.Tian" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity>    </application>

首先启动的Activity是 IntentFilterActivity 其中的 onCreateOptionsMenu 方法

public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);Intent in = new Intent();in.setAction("android.intent.action.Tian");in.addCategory("android.intent.category.Tian");this.startActivity(in);return true;}


注意这两句话

in.setAction("android.intent.action.Tian");in.addCategory("android.intent.category.Tian");

很明显了,我们这个intent没有明确指明需要和哪一个Activity交互,所以这是个隐式的intent,这三句话的意思是:当一个<activity>中的<intent-filter>中定义了

<action android:name="android.intent.action.Tian" />

<category android:name="android.intent.category.Tian" />

<category android:name="android.intent.category.DEFAULT"/> //注意这里,似乎这条语句必须要加,否则程序跑不起来。

的时候。这个intent会被此Activity得到,如果有两个或者两个以上的Activity中都定义了这个<intent-filter>则这两个Activity都会得到这个intent,此时系统会跳出一个列表框,让你选择使用哪一个程序来运行,比如在zxing安卓项目中使用分享功能时,就会跳出来一个列表框,上面有微信啊,短信啊,QQ啊等让你选择,这个功能就是intent-filter实现的。


再来看 MainActivity中的 onCreat方法

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.i("TRecorder","Action:"+getIntent().getAction());Iterator<String> is = getIntent().getCategories().iterator();while (is.hasNext()) {Log.i("TRecorder","Category:"+is.next());}Log.i("TRecorder","I2收到");}

因为此Activity可以响应刚才那个inte所以在这里我们可以打印出相应的消息。


再看IntentActivity 我们没有定义

<category android:name="android.intent.category.Tian" />

所以IntentActivity是无法响应刚才那个intent的。


总结一下:intent-filter 总是先匹配action 然后再 匹配 category ,如果有两个以上的Activity能够响应这个intent,则系统会让你选择使用哪一个Activity来响应这个intent。如果一个intent没有一个Activity能够响应此intent则程序会出错。


Androidmanife文件中不认识的标签大致就是这么几个,下一步开始阅读的是首先启动的Activity——CaptureActivity