Android查缺补漏–BroadcastReceiver的品类与利用

Broadcast
是一种被用来接纳内和选取之间传递信息的机制。一个广播可以对应三个接受者。一个全部的播音机制,需求具备以下两个要素:

诸多青年人伴会在后台和本身付诸互设计方面的难题,说实话,因为自己我是视觉设计出身,固然工作会参预互动流程的梳理和革新,也仍旧不敢太多的归结和统计互相设计方面的不二法门和知识,前几天给我们转译一篇国外设计师对活动交互设计中的一些提出,推荐给喜欢互相设计的恋人们阅读。

  • 发送广播的Broadcast
  • 经受广播的BroadcastReceiver
  • 传递消息的Intent

缘何大家要安装App?那是为了便利我们的生活。但当一个APP不可以满意这一渴求时,那么就会导致用户流失。你的APP成功取决于各样要素的组成,但里面最紧要的要素是一体化移动用户体验。伟大的用户体验是区分APP成功与否的元素。

广播的登记分为静态注册和动态注册:

当用户体验归咎为移动用户体验设计时,坚持不渝理想的执行是必走之路。在那篇文章里,大家将重点放在怎么样缓解避免打断或强迫用户去思辨本应很简短的工作这一基础点上。

  • 静态注册:静态注册的广播是指在AndroidManifest中登记的播音,此种广播在行使设置时就被系统解析,不须求启动应用就可以接收相应的播报。

多平台的用户界面设计

UI是让您APP的移动用户体验越发赏心悦目的一个着重元素。一大半开发者都盼望在多个平台上揭穿他们的APP,当您准备在多少个平台宣布APP时,请小心每个平台都有分别不相同的业内和特点。当您的设计稿在某个平台上看起来至极圆满的时候,但在此外平台上看起来却和规划稿差别,甚至相差很多。

<receiver android:name=".broadcast.MyBroadcastReceiver">
    <intent-filter>
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

1.决不模仿UI元素和任何平台的书体

当您设计Android
或iOS的App时,不要把其它平台的主旨元素带进App设计,也并非模仿他们的故意行为。因为即使您将元素从一个平台复制到另一个阳台,你就冒着侵害用户体验和转移的高危机。

输入框,复选框,开关和任何成效部件应该给人一种自然的感到。应该尽可能多地动用系统自带控件,让芸芸众生精通什么样运用它们,并且同意你的App获取他们敏锐数据的权能。在底下的事例中,你能够见到Android和iOS的分别。

对待于拟物设计,iOS的App日常表现的是扁平风骨,没有使用深度或阴影。iOS也有一个纯文本样式按钮,但在字体上它并没有利用Android的大写字体造型,反而选取了更纤细的字体造型。

字体也亟需符合各平台的正儿八经:Android的字体是罗布oto,而iOS使用San
弗朗西斯科字体。

一旦您想自定义App中的UI元素,请依照你的品牌举办自定义,而不是依照差别平台的正统开展自定义。

  • 动态注册:通过Context.registerReceiver()来落到实处,不要求时要透过Context.unRegisterReceiver()解除广播,此种广播必须使用启动后才能注册并接纳播放。

    // 动态注册广播接收器
    registerReceiver(new DynamicBroadcastReceiver(), new IntentFilter(MyBroadcastReceiver.ACTION));
    

2.永不通用平台特有的icon

阳台一般提供了一组广泛的效应icon,如共享,创设新的文档或删除文档。当你将App放到另一个平台时,你应当把平台特有的icon置换成该平台的icon。

你也理应多加关切各类平台的明白设计风格:Android系统的icon有较厚的思路,而iOS推崇线条icon,用格外细的笔画。上边是一个众所周知的例证,用几个图标举行相比较:

广播又分为普通广播、有序广播、本地广播和sticky广播。

3.不要将Web体验复制到App

用户期望在App中看到属于移动应用程序的一些交互格局和界面元素。网页设计放在移动应用端经常会感到到使用不便,因为它并不是用户所期望看到的。让自身给你举一个例证更清楚的描述:下划线链接。你应当幸免选择带有下划线链接的文件,因为那是浏览器页面模型的一个体制,而不是应用程序视图模型(应用程序使用按钮,而不是链接)的样式。

上面以TD银行iOS平台App的注册页面为例。那些设计看起来更像是网页而不是App。由此,他们只是提供了一个网站接口使它看起来像一个App:链接强调,甚至在UI中还有一个版权注明。

用户流量

一、普通广播

普普通通广播通过Context.sendBroadcast()发送,我们尚无艺术制定Receiver们对于普通广播的收纳顺序。理论上装有的接收器(Receiver)接收到广播的逐一不确定,但一般是比照其在AndroidMainfest.xml文件中注册的逐条(不相对)。
一般而言广播中,接受者不能将处理结果传递给下一个接收器,也不可以截至广播的散播。

一般来说代码是一个静态注册的播放示例:

public class MyBroadcastReceiver extends BroadcastReceiver {

    String TAG = MyBroadcastReceiver.class.getSimpleName();

    public static final String ACTION = "MY_BROADCAST_RECEIVER";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "接收到广播消息:" + intent.getStringExtra(BroadcastTestActivity.INTENT_INFO));
    }
}

下一场再AndroidMainfest.xml中注册这些广播:

<receiver android:name=".broadcast.MyBroadcastReceiver">
    <intent-filter>
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

接下去在Activity中调用Context.sendBroadcast()发送广播就足以了:

Intent intent = new Intent(MyBroadcastReceiver.ACTION);
intent.putExtra(INTENT_INFO, "我是一个普通广播");
sendBroadcast(intent);

log如下:

12-08 17:29:44.259 6644-6644/cn.codingblock.androidadvancestudy I/MyBroadcastReceiver: 接收到广播消息:我是一个普通广播
  • 常常广播的收取顺序测试
    俺们仿照MyBroadcastReciver创设三个接收器,代码一样:

/**
 * 静态注册的广播接收器2
 * Created by liuwei on 17/12/7.
 */
public class MyBroadcast2Receiver extends BroadcastReceiver {

    String TAG = MyBroadcast2Receiver.class.getSimpleName();

    public static final String ACTION = "MY_BROADCAST_RECEIVER";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "接收到广播消息:" + intent.getStringExtra(BroadcastTestActivity.INTENT_INFO));
    }
}
/**
 * 静态注册的广播接收器3
 * Created by liuwei on 17/12/7.
 */
public class MyBroadcast3Receiver extends BroadcastReceiver {...}
/**
 * 静态注册的广播接收器4
 * Created by liuwei on 17/12/7.
 */
public class MyBroadcast4Receiver extends BroadcastReceiver {...}
/**
 * 静态注册的广播接收器5
 * Created by liuwei on 17/12/7.
 */
public class MyBroadcast5Receiver extends BroadcastReceiver {...}
/**
 * 静态注册的广播接收器6
 * Created by liuwei on 17/12/7.
 */
public class MyBroadcast6Receiver extends BroadcastReceiver {...}

下一场在AndroidMainfest.xml中为上述广播都登记同一个action

<receiver android:name=".broadcast.MyBroadcastReceiver">
    <intent-filter>
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

<receiver android:name=".broadcast.MyBroadcast6Receiver">
    <intent-filter>
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

<receiver android:name=".broadcast.MyBroadcast2Receiver">
    <intent-filter>
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

<receiver android:name=".broadcast.MyBroadcast3Receiver">
    <intent-filter>
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

<receiver android:name=".broadcast.MyBroadcast4Receiver">
    <intent-filter>
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

<receiver android:name=".broadcast.MyBroadcast5Receiver">
    <intent-filter>
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

点击发送广播,查看log:

12-08 17:29:44.259 6644-6644/cn.codingblock.androidadvancestudy I/MyBroadcastReceiver: 接收到广播消息:我是一个普通广播
12-08 17:29:44.268 6644-6644/cn.codingblock.androidadvancestudy I/MyBroadcast6Receiver: 接收到广播消息:我是一个普通广播
12-08 17:29:44.271 6644-6644/cn.codingblock.androidadvancestudy I/MyBroadcast2Receiver: 接收到广播消息:我是一个普通广播
12-08 17:29:44.273 6644-6644/cn.codingblock.androidadvancestudy I/MyBroadcast3Receiver: 接收到广播消息:我是一个普通广播
12-08 17:29:44.277 6644-6644/cn.codingblock.androidadvancestudy I/MyBroadcast4Receiver: 接收到广播消息:我是一个普通广播
12-08 17:29:44.280 6644-6644/cn.codingblock.androidadvancestudy I/MyBroadcast5Receiver: 接收到广播消息:我是一个普通广播

1.您的App中不该有死胡同。

交互设计就是流程的设计,在大部情景下推动用户完结所愿意的靶子。你应有幸免用户在您的App中走进死胡同,因为死胡同会让用户暴发苦恼并促成不需要的操作。有时设计师把错误音信和重重据气象统筹成空白的页面,但实质上那是一个很好的时机,可以做一些一蹴而就的事情。上面那几个页面是Spotify的荒谬状态页面

它根本无法协理用户知道上下文,没有答复这一个标题:“我能做怎么着呢?“

无多少状态(尤其是大错特错状态)不该是一个不得一连操作的意况,相反它应当告诉用户确切的行进以便呈现触发后的始末和APP的例行运作。

二、有序广播

在AndroidMainfest.xml中登记广播时通过priority(值越优先级越高)节点为广播添加优先级,然后再用Context.sendOrderedBroadcast()发送,接收者们就会鲁人持竿优先级依次依次执行。

不变广播的接收者和给下一个接收者传递数据,并且接收者在接收广播之后方可舍弃广播,使广播不再向后传递。

为地点6个接收器添加优先级:

<receiver android:name=".broadcast.MyBroadcastReceiver">
    <intent-filter android:priority="1">
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

<receiver android:name=".broadcast.MyBroadcast6Receiver">
    <intent-filter android:priority="6">
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

<receiver android:name=".broadcast.MyBroadcast2Receiver">
    <intent-filter android:priority="2">
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

<receiver android:name=".broadcast.MyBroadcast3Receiver">
    <intent-filter android:priority="3">
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

<receiver android:name=".broadcast.MyBroadcast4Receiver">
    <intent-filter android:priority="4">
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

<receiver android:name=".broadcast.MyBroadcast5Receiver">
    <intent-filter android:priority="5">
        <action android:name="MY_BROADCAST_RECEIVER" />
    </intent-filter>
</receiver>

然后经过sendOrderedBroadcast发送广播观望log:

intent = new Intent(MyBroadcastReceiver.ACTION);
intent.putExtra(INTENT_INFO, "我是一个有序广播");
sendOrderedBroadcast(intent, null);

log如下:

12-08 18:17:26.455 25919-25919/cn.codingblock.androidadvancestudy I/MyBroadcast6Receiver: 接收到广播消息:我是一个有序广播
12-08 18:17:26.462 25919-25919/cn.codingblock.androidadvancestudy I/MyBroadcast5Receiver: 接收到广播消息:我是一个有序广播
12-08 18:17:26.464 25919-25919/cn.codingblock.androidadvancestudy I/MyBroadcast4Receiver: 接收到广播消息:我是一个有序广播
12-08 18:17:26.465 25919-25919/cn.codingblock.androidadvancestudy I/MyBroadcast3Receiver: 接收到广播消息:我是一个有序广播
12-08 18:17:26.466 25919-25919/cn.codingblock.androidadvancestudy I/MyBroadcast2Receiver: 接收到广播消息:我是一个有序广播
12-08 18:17:26.467 25919-25919/cn.codingblock.androidadvancestudy I/MyBroadcastReceiver: 接收到广播消息:我是一个有序广播
  • abortBroadcast()废弃广播:
    平凡的播放是不曾章程甩掉的,否则会抛出RuntimeException的不得了。

只有静止广播才得以经过此措施废弃。大家在MyBroadcast6Receiver中添加abort布罗德cast()方法:

public class MyBroadcast6Receiver extends BroadcastReceiver {

    String TAG = MyBroadcast6Receiver.class.getSimpleName();

    public static final String ACTION = "MY_BROADCAST_RECEIVER";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "接收到广播消息:" + intent.getStringExtra(BroadcastTestActivity.INTENT_INFO));
        abortBroadcast();
        Log.i(TAG, "丢弃广播");
    }
}

接下来点击发送有序广播,log如下:

12-08 18:34:27.989 1329-1329/cn.codingblock.androidadvancestudy I/MyBroadcast6Receiver: 接收到广播消息:我是一个有序广播
12-08 18:34:27.989 1329-1329/cn.codingblock.androidadvancestudy I/MyBroadcast6Receiver: 丢弃广播

能够见见广播已经被扬弃了。

  • setResult()传递给下一个接收者结果。
  • getResult()接收上一个接收者的结果。

在MyBroadcast6Receiver中添加setResult方法,在MyBroadcast5Receiver添加getResult方法:

public class MyBroadcast6Receiver extends BroadcastReceiver {

    String TAG = MyBroadcast6Receiver.class.getSimpleName();

    public static final String ACTION = "MY_BROADCAST_RECEIVER";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "接收到广播消息:" + intent.getStringExtra(BroadcastTestActivity.INTENT_INFO));
//        abortBroadcast();
//        Log.i(TAG, "丢弃广播");
        setResult(006, "我是老6传来的消息", null);
    }
}
public class MyBroadcast5Receiver extends BroadcastReceiver {

    String TAG = MyBroadcast5Receiver.class.getSimpleName();

    public static final String ACTION = "MY_BROADCAST_RECEIVER";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "接收到广播消息:" + intent.getStringExtra(BroadcastTestActivity.INTENT_INFO));
        String data = getResultData();
        Log.i(TAG, "data=" + data);
    }
}

log如下:

12-08 18:40:01.415 10372-10372/cn.codingblock.androidadvancestudy I/MyBroadcast6Receiver: 接收到广播消息:我是一个有序广播
12-08 18:40:01.434 10372-10372/cn.codingblock.androidadvancestudy I/MyBroadcast5Receiver: 接收到广播消息:我是一个有序广播
12-08 18:40:01.434 10372-10372/cn.codingblock.androidadvancestudy I/MyBroadcast5Receiver: data=我是老6传来的消息
12-08 18:40:01.440 10372-10372/cn.codingblock.androidadvancestudy I/MyBroadcast4Receiver: 接收到广播消息:我是一个有序广播
12-08 18:40:01.442 10372-10372/cn.codingblock.androidadvancestudy I/MyBroadcast3Receiver: 接收到广播消息:我是一个有序广播
12-08 18:40:01.445 10372-10372/cn.codingblock.androidadvancestudy I/MyBroadcast2Receiver: 接收到广播消息:我是一个有序广播
12-08 18:40:01.447 10372-10372/cn.codingblock.androidadvancestudy I/MyBroadcastReceiver: 接收到广播消息:我是一个有序广播

2.并非把用户带到浏览器

让用户在其他时候都在App中。假若你的App贫乏一个特定的法力或内容,尝试运用App内置的浏览器,不要引起手机自带的浏览器,不然的话你会导致用户遗忘他们的应用轨道,不会回来到应用程序,这将净增用户甩掉或回落使用App的高危害。

三、本地广播

如上的广播对于系统来说是大局的,发出广播后,系统内的利用只要注册了相应的接收器就都得以接到广播。即使大家想在本利用发出的广播只在此拔取内可以接收,那么可以行使当地广播了。

本土广播由 LocalBroadcastManager 管理,是在 API 21
将来添加的,使用起来也很方便,需求先通过
LocalBroadcastManager.getInstance()
方法取得其单例,剩下的用法与其余广播类似,其利害攸关格局有以下多少个:

  • registerReceiver():注册广播接收器。
  • unregisterReceiver():解除广播接收器。
  • sendBroadcast():发送异步广播。
  • sendBroadcastSync():发送同步播报。

使用当地广播时,无需在AndroidMainfest.xml中注册,必须运用
LocalBroadcastManager.getInstance(…).registerReceiver(..)来注册接收器。

大家来写个地面广播的小栗子,首先注册八个地点广播:

LocalBroadcastManager.getInstance(context).registerReceiver(new MyBroadcastReceiver(), new IntentFilter(MyBroadcastReceiver.ACTION));
LocalBroadcastManager.getInstance(context).registerReceiver(new MyBroadcast2Receiver(), new IntentFilter(MyBroadcastReceiver.ACTION));

然后发送本地广播:

intent.putExtra(INTENT_INFO, "我是一个本地广播");
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

log如下:

12-09 17:20:47.799 15019-15019/cn.codingblock.androidadvancestudy I/MyBroadcastReceiver: 接收到广播消息:我是一个本地广播
12-09 17:20:47.799 15019-15019/cn.codingblock.androidadvancestudy I/MyBroadcast2Receiver: 接收到广播消息:我是一个本地广播

3.并非必要用户在下载完App后即时为App评分

从不人真的想被打断,更不要说她在做首要业务时被无意义的政工打断。即使他们近期才下载或只利用了两回App,那么幸免必要用户为您的App评分。相反,等到他们直到被证实是重新用户,他们将更有可能为你的App提供越多反映。

你可以在用户打开App一定次数后要么完结你一定的对象时在来触发评级须求。Dan
Counsell在曾几何时弹出评分弹框有很好的洞察力。以下是她对待工作项应用程序Clear的评价:“iOS平台的clear的评分弹框在局地境况下被触发。首先,用户必须已经运用了多少个礼拜的应用程序。其次,清除用户已经解除了从列表中的剩余职责。那是一个在App中要求评分的地道机遇,用户感到很好,因为她们正好清理了她们的义务列表并且在大部分气象下他们准备退出App。

务求评分是绝非错的,但切记您想给您的用户一个优质的感受。

四、sticky广播(不指出拔取)

sticky广播会一向处在滞留情形,sticky广播被暴发后,只要有能够合营其的新接收器被注册了就足以拔取广播,sticky广播通过Context.sendSticky布罗德cast()发送。


末尾想说的是,本种类文章为博主对Android知识举行重复梳理,查缺补漏的就学进度,一方面是对自己忘记的事物加以复习重新了解,另一方面相信在重新学习的进度中定会有英雄的新取得,如若你也有跟自身同一的想法,不妨关切自我一块上学,相互切磋,共同进步!

参考文献:

  • 《Android开发方式探索》
  • 《Android开发进阶从小工到专家》

结语

人人对前几日的App的界面期望越来越高,标准也变得尤为高。你要求努力干活,以满足这几个愿意,让您的App令人快乐。进步用户体验不是一个四遍性的职务,那是一个缕缕的长河。

以上内容由本人原创转译,转载请注脚出处,否则后果必究。

**关于大宝(我本身):**


网络世界设计师,跨界于广告、创意、工业规划、用户体验等世界,喜欢时尚,本身却很土,定期写文,欢迎提出你感兴趣的筹划、艺术、创意等话题,试着做一个书写设计来影响你的人。

迎接关怀,阅读越来越多原创造计思想。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图