当前位置: 首页 > 科技观察

给iOS开发者的Android开发技巧_0

时间:2023-03-21 17:28:18 科技观察

我做了5年的iOS应用程序开发者,在那段时间里,我试图尽可能地避免使用Android——但现在不再是这样了。信不信由你,Android开发非常有趣,与iOS开发并没有您想象的那么不同。我在Android平台上开发了“七分钟锻炼”APP,通过它学到了很多有价值的知识。希望本文分享的一些小技巧也能帮助大家解决实际问题。请注意,我接下来要比较的内容不一定完全匹配,并且本文的重点不是全面介绍Android开发;当然,我一定会提到我在开发这个简单的应用程序时所学到的所有经验。我选择的IDE是AndroidStudio,我敢打赌,一旦测试完成,它会成为未来的行业标准。虽然有很多反映它的运行状态不稳定,但在我的实际使用中,它只死机过一次。也许我只是习惯了Xcode。Java不管你怎么评价Java,归根结底它只是一门编程语言。它解决了问题,对于有经验的开发人员来说,肯定会专注于框架而不是Java。很高兴我不必参与J2EE。模拟器一直觉得iOS模拟器很头疼,对比之下才发现自己还是太年轻了。经过一些试验后,我决定放弃Android模拟器,将应用程序直接部署到实际设备上——除非人们愿意花大量时间盯着屏幕等待。Storyboard/NIB我在我的iOS开发博客上谈论了很多关于Storyboard的话题,一些来自不同意我的读者的措辞强硬的电子邮件让我完全放弃了这个交流平台。Android使用的布局格式是xml。它们彼此完全独立。AndroidStudio还提供了一组出色的“所见即所得”编辑器:但如果需要,您仍然可以深入研究原始xml(我通常不想打扰)。相对于自动布局,还可以选择其他布局容器,比如RelativeLayout、FrameLayout。这里,我们可以通过像素数(即设备的像素容量)或者matchparent、wrapcontant等来设置理想的宽高、填充效果、边框和颜色。Wrap非常适合文本内容,它会自动调整正确的高度并设置合适的大小,剩下的工作交给特定的布局方案,如LinearLayout。虽然我还没有使用过,但Fragments看起来也是重新调整自定义UI元素用途的好方法。UIViewControllerAndroid使用一个Activity来实现UIViewConroller的功能。每个屏幕/窗口相当于一个活动。这是我们处理大部分工作的地方,包括将数据绑定到UI或处理事件等。Controller/View转换在iOS中,我们使用segue、pushViewController、presentController等在不同屏幕之间进行迁移。但是在Android环境下,我们需要用到Intent。您可以轻松迁移到新活动,甚至可以传递一些数据。publicvoidonItemClick(...){Intenti=newIntent(getBaseContext(),MyActivity.class);i.putExtra("row",position);startActivity(i);}中的newActivity(即上面的MyActivity代码),我们可以提取传递的数据:=extras.getInt("row");....}...}也可以使用Intent触发各种事件,比如实现表共享:IntentsendIntent=newIntent();sendIntent.setAction(Intent.ACTION_SEND);sendIntent.putExtra(Intent.EXTRA_TEXT,"ShareThis");sendIntent.setType("text/plain");startActivity(sendIntent);IBOutlet也许你和我一样,在超过一半的情况下忘记连接到IBOutlet。在Android中,每个场景/组件都有一个独立的ID,内容如下:@+id/myButton会自动生成一个名为R的类(可以点这里了解R的相关信息),接下来我们可以访问代码中的button如下:Buttonbutton=(Button)findViewById(R.id.myButton);TagiOS开发者经常使用的一个技巧是使用场景标签来存储find信息,比如整体布局位移。在Android环境下,还可以将整个对象添加到标签中,非常实用。row.setTag(数据);UITableViewController/UITableViewDataSource/UITableViewCellAndroid中的ListView相当于iOS中的UITableView。而UITableViewDataSource对应Android中的ArrayAdapter:MyAdapteradapter=newMyAdapter(this,R.layout.listview_item_row);listView.setAdapter(适配器);其中listviewitemrow属于一行的布局,相当于iOS中的UITableViewCell。然后,其中的适配器将创建/重用getView中的行。您还可以像这样设置标题:Viewheader=getLayoutInflater().inflate(R.layout.listview_header_row,null);listView.addHeaderView(header);网上有很多优秀的教程,感兴趣的朋友可以点击这里查看其中的一篇。图片/资源借助AssetCatalogue,iOS环境下的图片处理变得非常简单。通常,开发者只需要考虑视网膜屏和非视网膜屏这两种情况(除非你想为iPad使用特殊的Image)。由于Android阵营的设备分辨率差异很大,所以必须提供以下四种图片格式。它们是:mdpi(普通分辨率)、hdpi(高分辨率)、xhdpi(超高分辨率)和xxhdpi(超超高分辨率)。我个人认为xxxhdpi版本的诞生只是时间问题。使用AndroidStudio创建项目时,只需要提供一个图标,它就可以自动创建这四种格式。这种做法相信给一直从事Android应用开发的朋友们留下了严重的心理阴影:不用怕,后期可以手动更换最新的pixel版本。因此,最基本的解决方案是为每个像素密度的每个图像创建一个单独的版本,为其命名并放在正确的文件夹下;选择理想的版本。自定义字体自定义字体在Android上实现起来也很简单:将字体复制到main/assets,然后使用如下代码调用:Typefacefont=Typeface.createFromAsset(getAssets(),"Lato-Regular.ttf");textView.setTypeface(字体);问题是这种方法并不是在所有设备上都有效,所以你需要准备一套后备字体——但我的两台安卓设备都没有提供这样的字体。NSLog日志好像没什么好说的,可以用来调试应用程序什么的(这里省千字)。System.out.println(..)似乎也可以完成这项工作。向后兼容性我们都听说过Android设备的碎片化问题。但本质上,处理旧版本的Android并不比在旧版本的iOS上使用新的iOS功能更难。不过,你可能需要非常重视这个兼容性,毕竟Android环境下出现此类问题的频率远高于iOS。我们可以通过下面的代码查看当前Android版本:if(Build.VERSION.SDK_INT>=11.0){...}下面的代码用来防止函数调用引起的警告信息:@SuppressLint({"NewApi","LocalSuppress"})privatevoidmyFunction(){...}漫长而奇怪的Android旅程CountDownTimerCountDownTimer-我对这个内置功能的存在感到非常兴奋,因为这是我的七分钟锻炼应用程序所需要的。但是经过实际测试,不会发送onFinish之前的最后一个onTick。这是一个非常奇怪的错误,直到现在都没有修复。奇怪,真的很奇怪。Orientation当用户转动手中的设备时,我们的Activity也将被完全重置,这意味着您必须在Activity重新加载后保留所有状态和恢复机制。在Android环境下处理起来很头疼,但iOS处理得很好。KindleFire/AmazonStore为了让我的应用程序进入亚马逊商店,我只需要对现有结果进行两个调整:YouTubeSDK不起作用,因为YouTube应用程序在KindleFire上不可用。但是,仍然保留了支持Flash的能力。您将需要替换亚马逊商店的应用程序购买代码。您可以使用android.os.Build.MANUFACTURER和android.os.Build.MODEL来检测设备的制造商和产品型号信息。单击此处查看有关各型号KindleFire的详细信息。原文链接:http://stuartkhall.com/posts/android-development-tips-for-ios-devs原文链接:AndroidDevelopmentTipsforiOSDevs核可乐翻译