初学安卓,想了解一个完整的APP是怎么做出来。发现谷歌zxing中有一个安卓的开源项目,我打算学习这个项目,学习这个项目中所涉及的一系列知识。
我下载的是zxing2.1的源码,导入eclipse后能在我的手机上运行。
看安卓项目当然先看AndroidManifest
AndroidManifest中首先声明了一些必须的权限
1 <uses-permission/> //权限标签
---------------------------------------------------------------------------------------------
权限标签下面是:
2 <uses-feature/>
我理解的是:APP市场能够通过此标签过滤要显示给用户的应用程序,因此用户只能看到和下载那些跟他们的设备兼容的应用程序。通过功能的兼容性来过滤应用程序是这个方法之一。
(参考:(http://blog.csdn.net/think_soft/article/details/7596796))
我做了个测试:因为我的手机没有闪光灯,所以我将文件中:
<uses-feature android: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方法
@Override protected 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