andnroidAndroid开发经验谈android开发技巧

项目需求讨论-Android推送及Activity启动方式

2017-01-04  本文已影响1377人  青蛙要fly

以前做过一个项目是这样的。手机端监控服务器的状态,首页显示的是监控的服务器的总数及报错数量,然后点击进入后,是列表界面,可以看到报错的服务器列表及好的服务器列表,然后点击列表中的某个可以具体看这个服务器的详情内容,比如监控哪几个进程,哪个进程报错了等信息。所以一共是三个界面:1、首页,2、列表界面,3、详情界面

需求:
  1. 当服务器有报错信息,或者是服务器由错误变成正确的时候,都会有信息推送到手机端。消息推送到达率尽可能要高,因为是监控服务器,所以不像一般的软件通知可有可无。

  2. 当用户是把软件关掉的状态下接受到信息是没关系,反正点击推送信息,都会再打开应用;但是当用户处于上述三个界面的某个界面的时候,都需要立即刷新当前所属界面的信息。比如当前客户是在首页的话,那信息推送过来后,首页就要被刷新;如果是在列表界面,有信息的话,列表界面就要被刷新;如果在详情界面,那详情界面就要被刷新。**


需求一处理:

前提说明,关于推送,我这边因为也做了个iOS小项目。也写了iPhone的推送,所以就粗略说下二者的推送(希望大家能指正,让我学习下):

IPhone信息推送 Android信息推送

所以在Android设备上想要确保推送率,就是说如何让你接受监控服务器信息进程能尽可能的存活在手机中,从而能够接收到服务器发来的信息。
大家可以看下下面这边链接:
Android 进程保活招式大全

如果自己觉得写接受信息的进程太麻烦,就可以直接使用市面上现场的第三方推送,我大概分了下是这几种:

我这边用的是LeanCloud的混合推送,因为混合推送是内部帮忙集成了小米推送和华为推送,及自带的LeanCloud推送,尽量确保了推送的到达率。阿里云推送也有个混合推送,也是同样的道理。
LeanCloud混合推送


设置完推送,记得对不同手机开启不同权限开关

Paste_Image.png
需求二处理:

(ps:可能大家有更好的需求二的处理方法,希望大家下面回复我。可能我那时候这么处理并不是特别好。)

推送的讨论完了。我们来看下我们的第二个需求,因为推送信息的接受及处理,是在自定义BroadcastReceiver的onReceive(Context context, Intent intent) 方法中获取到信息。所以我想到了context.startActivity方法来启动相应的界面。而且这个界面还不能被重复的开了多个,不然按个返回按钮,就又出现那个老的界面了。在这个应用中,这个界面startActivity多次也只有这一个Activity实例。那这个界面不就等于被刷新了么。

我们分步来解决第二个需求:

1.如何知道当前是处于那个界面,是首页、列表界面,还是详情界面?

String className = ((ActivityManager.RunningTaskInfo) ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningTasks(1).get(0)).topActivity.getClassName();
if ("com.monitorapp.module.home.ui.Act_Main".equals(className)) {
        Intent intent_main = new Intent(context, Act_Main.class);
        intent_main.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent_main);
} else if ("com.monitorapp.module.servers.ui.Act_ServerList".equals(className)) {
        Intent intent_list = new Intent(context, Act_ServerList.class);
        intent_list.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent_list);
} else if ("com.monitorapp.module.servers.ui.Act_MonitorDetail".equals(className)) {
        Intent intent_detail = new Intent(context, Act_MonitorDetail.class);
        intent_detail.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent_detail);
}

没错,我们可以获取到顶部的Activity的类名。然后我们把这个类名与这三个界面的类名进行比较就可以了。然后和哪个界面的Activity类名相同,就去启动相应的Activity就可以。

2.如何startActivity的时候不会开多个该Activity的实例。这就与Activity的启动方式有关。

Activity启动方式:

大家也可以看下相关介绍:
Activity任务栈以及启动模式

好了。我们也了解了Activity的启动方式,当时我用的是singleInstance.但是对于这个需求的实现,singleTop和singleTask都可以使用。然后因为这时候这么设置了Activity的启动方式后。再去startActivity,这时候就会去调用改Activity的onNewIntent方法,这时候我们只要在各自的Activity的onNewIntent方法中写上相关接口调用及界面的数据刷新功能就可以了。

<activity
    android:name=".module.home.ui.Act_Main"
    android:launchMode="singleInstance"
    >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>

<activity
    android:name=".module.monitor.ui.Act_ServerList"
    android:launchMode="singleInstance"
    >
</activity>

<activity
    android:name=".module.monitor.ui.Act_MonitorDetail"
    android:launchMode="singleInstance"
    >
</activity>
@Override
protected void onNewIntent(Intent intent) {
     super.onNewIntent(intent);
     //调用相关接口,然后进行界面刷新
}
上一篇下一篇

猜你喜欢

热点阅读