即时聊天APP(二) - MainActivity

主活动包含三个Fragment,分别是会话、联系人和设置,初始布局隐藏所有碎片,然后把应该显示的显示出来:

//隐藏所有Fragment
private void hideAll(){
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.hide(first)
            .hide(second)
            .hide(third)
            .commit();
}
//初始化布局
private void init() {
    textView = findViewById(R.id.common_actionbar);
    textView.setOnClickListener(this);
    textView.setText("会话");
}
//初始化Fragment
private void initFragment() {
    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    first = new Conversationlist();
    second = new Friends();
    third = new My();
    ft.add(R.id.fragment,first);
    ft.add(R.id.fragment,second);
    ft.add(R.id.fragment,third);
    hideAll();
    //判断当前显示界面
    if(Tips.current == 0 || Tips.current == 1){
        ft.show(first);
        textView.setText("会话");
    }else if(Tips.current == 2){
        ft.show(second);
        textView.setText("联系人");
    }else {
        ft.show(third);
        textView.setText("设置");
    }
    ft.commit();
}  

接下来连接服务器,这里我放置了一个线程,每隔1秒检查检查一次是否连接成功:

//连接服务器
private void connect() {
    //检查网络连接
    if(!NetWork.isNetConnection(this)){
        Toast.makeText(this,"无网络连接!",Toast.LENGTH_SHORT).show();
        isConnect = false;
    }else{
        //每秒检查是否连接
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                if(!isConnected())
                    isConnect = false;
                else
                    isConnect = true;
            }
        }, 300,1000);
        try {
            if (!isConnect) {
                if (Tips.MainActivity_fail == 0) {
                    Toast.makeText(MainActivity.this, "服务器连接失败!正在重试...", Toast.LENGTH_SHORT).show();
                    Tips.MainActivity_fail = 1;
                    Tips.MainActivity_success = 0;
                }
                BmobIM.connect(MyUser.getUni(), new ConnectListener() {
                    @Override
                    public void done(String s, BmobException e) {
                        if (e == null) {
                            isConnect = true;
                            retry = 0;
                            if (Tips.MainActivity_success == 0) {
                                Toast.makeText(MainActivity.this, "服务器连接成功!", Toast.LENGTH_SHORT).show();
                                Tips.MainActivity_success = 1;
                                Tips.MainActivity_fail = 0;
                            }
                        }else {
                            if (retry == 0)
                                if (Tips.MainActivity_fail == 0) {
                                    Toast.makeText(MainActivity.this, "服务器连接失败!正在重试...", Toast.LENGTH_SHORT).show();
                                    Tips.MainActivity_fail = 1;
                                    Tips.MainActivity_success = 0;
                                } else
                                    retry++;
                            connect();
                        }
                    }
                });
            }
        }catch (Exception e){}
    }
}  

这里是判断是否连接的代码:

//判断是否连接
private boolean isConnected(){
    boolean IsCon = false;
    try {
        String mg = BmobIM.getInstance().getCurrentStatus().getMsg();
        if(mg.equals("connected"))
            IsCon = true;
    }catch (Exception e){
        IsCon = false;
    }
    return IsCon;
}  

这里是发送自定义广播的代码,使用EventBus来触发事件:

//发送广播
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(cn.edu.sau.joker.MessageEvent event) {
    Intent intent = new Intent("cn.edu.sau.action.MESSAGE");
    intent.putExtra("msg",event.message);
    sendBroadcast(intent);
}  

下面是退出代码,上面的部分是用户在点击退出的时候会finish掉此Activity,下面时用户点击两次返回键finish当前活动退出:

//销毁活动
@Override
protected void onNewIntent(Intent intent){
    super.onNewIntent(intent);
    if (intent != null) {
        boolean isExit = intent.getBooleanExtra(TAG_EXIT, false);
        if (isExit) {
            this.finish();
        }
    }
}
//连续按两次返回键就退出
@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    if (firstTime + 2000 > System.currentTimeMillis()) {
        super.onBackPressed();
    } else {
        Toast.makeText(this,"再按一次退出程序",Toast.LENGTH_SHORT).show();
        //     Toa("再按一次退出程序");
    }
    firstTime = System.currentTimeMillis();
}  

另外,在使用EventBus时要进行注册和注销:

//注册订阅者
    EventBus.getDefault().register(this);
// 注销订阅者
    EventBus.getDefault().unregister(this);

原文地址:https://www.cnblogs.com/zqm-sau/p/10331916.html

时间: 2024-10-09 06:59:28

即时聊天APP(二) - MainActivity的相关文章

即时聊天APP(五) - 聊天界面

设置界面没什么好说的,无非也就是加了个对话框来二次提醒用户,现在来讲讲聊天界面. 聊天界面初始化时会得到一个参数,就是对方的id,并设置在标题栏的位置,此界面也是使用RecyclerView来展示聊天消息. 首先为RecyclerView添加布局管理器(线性布局),并且为其添加适配器,写适配器之前先写类,消息类展示: public class Msg extends LitePalSupport { public static final int TYPE_RECEIVED = 0; // 接收

即时聊天APP(六) - 消息的接收以及EventBus使用

通常我们在接收消息的时候会有声音和震动的提示,因此我也加了代码达到这样的效果,这就要用到EventBus了,当然这里我也用到了自定义的广播,所以首先在Mainfests文件中加入以下代码: <receiver android:name=".MylocalMessage" android:process=":bmobpush" > <intent-filter> <!-- 接收自定义广播的action --> <action

即时聊天APP(三) - 注册和登陆

注册和登陆大多都是一些用户名和密码的验证,所以放在一起写,注册代码: String account = accountEdit.getText().toString().trim(); String password = passwordEdit.getText().toString().trim(); String yanzheng = yanzhengma.getText().toString().trim(); if(account.equals("")||password.eq

即时聊天APP(四) - 联系人和会话

联系人和会话界面使用的是RecyclerView进行滑动显示,并将好友列表存储至数据库,以供下次登录时使用,RecyclerView在后面我会详细介绍,这里略过. 联系人初始化时读取数据库并展示: //读取数据库中的好友列表 private void read__db() { ListlLi = LitePal.findAll(LList.class); for (int i=0 ; i<lLi.size(); i++){ //加个异常 try{ LList lLis = new LList(l

即时聊天IM之二 openfire 整合现有系统用户

合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:[email protected]  综述: 每天利用中午时间更新下这个知识点的的博客如果感兴趣的觉得更新慢了也别介意(其它时间还是以工作为主,学习工作两不误,哈哈……).上一篇我纯理论上简单讲解了一下XMPP协议,然而现在用的比较多的XMPP协议服务器当然是openfire最为流行(我感觉).至于如何搭建oprenfire 二次开发环

高仿QQ即时聊天软件开发系列之二登录窗口界面

继上一篇高仿QQ即时聊天软件开发系列之一开端之后,开始做登录窗口 废话不多说,先看效果,只有界面 可能还有一些细节地方没有做,例如那个LOGO嘛,不要在意这些细节 GIF虽短,可是这做起来真难,好吧因为我没玩过WPF所以难,因为感觉做出来之后也就那样 整体布局 整体是上下分,下面是左中右分 1 <Grid> 2 <Grid.RowDefinitions> 3 <RowDefinition Height="27"><!--用于放窗口右上角关闭.最

Node.js + Web Socket 打造即时聊天程序嗨聊

前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前后端之间代码敲得飞起,从此由前端晋升为'前后端'. 图片来自G+ 本文将使用Node.js加web socket协议打造一个网页即时聊天程序,取名为HiChat,中文翻过来就是'嗨聊',听中文名有点像是专为寂寞单身男女打造的~ 其中将会使用到express和socket.io两个包模块,下面会有介绍

开发一款即时通讯App,从这几步开始

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 "晚上去哪吃饭啊?" 桌面上来自一条晚上约饭的对话框--QQ. 突然灵光一现,新出了优化的IM SDK,可以尝试着搭建一个类似QQ的即时通讯软件 01 注册账号 腾讯云官网 注册腾讯云账号,也可以使用QQ或者微信直接登陆 02 创建应用 选择[产品]→[云通信]→[立即使用]→[创建应用接入] 03

高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输入时显示一个提示字符串.由于Background对ComboBox无效,所以直接通过Background来实现是不行了.需要重新写ComboBox的模板,也就是Template,自定义一个模板来实现这个结果.又看了一下QQ的下拉框,这玩意不自定义也难以实现,所以就干脆自定义了. 先上代码,先是Com