Supporting Different Screen
安卓的屏幕适配以前一直是个重要的话题。这些适配技巧固定,渐渐的不再成为大家讨论的焦点了
通过安卓项目提供的特性适配多屏幕.分类处理,针对不同的手机屏幕情况,给出不同的参数设置文件
引入dip(dp)距离单位,该单位与像素密度相关,而与屏幕像素没有直接关联。像素密度和分辨率决定了一个屏幕的尺寸大小
Fragment实现DynamicUI
传统官方的Fragment和Activity之间的通信方式
通信:Framgnet出一部门内容,Activity出一部门内容,把这两部门内容合在一起处理
通信一:如何实现Activity对Fragment的通信
- setArgument()把数据传入fragment
- 在Activity里,持有Fragment对象,调用Fragment的方法
通信二:如何实现Fragment对Activity的通信
通过接口回调,Activity实现接口,实现赋值到fragment里
如何实现在同一个Activity里,Fragment与Fragment之间的通信
Fragment先和Activity通信(使用通信二);然后Activity再与另一个Fragment通信(使用通信一)。这样就实现了Fragment之间的通信
RxBus/EventBus实现组件间解耦
使用上述传统Fragment和Activity通信方式的书写繁琐,耦合程度较高,尤其Framgent里还有列表控件(RecyclerView,ListView等)的Adapter类里的点击响应和Fragment、Activity之间的交互,就更现繁琐,逻辑跳转多,维护性降低。
为此,目前安卓项目中广泛使用的EventBus/RxBus有效解决了这个问题,其中RxBus得到了EventBus作者的推荐和肯定,Rx响应理念也越来越盛行,推荐使用RxBus
Share Simple Data
通过Intent,实现了单个App内四大组件的通信以及App间的通信。某个App内容分享到另一个App,也正是利用Intent把数据传过去。
比如,我把在新闻看到的App内容通过邮件App发送给我的好朋友,怎么实现?
首先要对Intent页面跳转有了解,可以阅读这篇官方文档 Intent和Intent过滤器。Intent分显示和隐式,显式用在App内启动Activity和Server,隐式用在启动其他应用的组件。
该文阅读后,注意事项:
方法 startActivity() 和 startActivityForResult() 将按照已申明 CATEGORY_DEFAULT 类别的方式处理所有 Intent。 如果未在 Intent 过滤器中声明此类别,则隐式 Intent 不会解析为您的 Activity。
Android 会自动将 CATEGORY_DEFAULT 类别应用于传递给 startActivity() 和 startActivityForResult() 的所有隐式 Intent,因此如需 Activity 接收隐式 Intent,则必须将 "android.intent.category.DEFAULT" 的类别包括在其 Intent 过滤器中
如果过滤器只是列出 MIME 类型,则假定组件支持 content: 和 file: 数据
-
startActivity不仅可以启动当前App里的Activity,还可以启动其他App的Activity,只要这个Activity允许接受其他App的请求,这个标志位在Manifest.xml的Activity标签里配置,如下(其他配置信息省略)
<Activity android:exported="false/true">
<intent-filter></intetn-filter>
</Activity>
发送方通过Intent的键值存储数据,接收方从Intent根据之前存入的键取出数据,因此需要统一键的内容。发送方和接受方在我举的例子里,新闻类App是发送方,邮件是接收方,相互之间不知道对方,这个键的内容一致怎么约定呢?这个约定Android系统做了。
Intent类下有很多静态常量,其中Intent.EXTRA_xxx系列就是各种约定的键内容。关于Intent跳转的组成数据和用法,详细看这篇
代码实现如下:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_EMAIL,new String[]{"sugaryaruan@gmail.com","sugarya@foxmail.com"});
intent.putExtra(Intent.EXTRA_SUBJECT,"我是分享标题");
intent.putExtra(Intent.EXTRA_TEXT,"我是分享内容....");
if(intent.resolveActivity(getPackageManager()) != null){
startActivity(Intent.createChooser(intent,"Share via"));
}