推送sdk (类似百度 推送 ) android mina (待优化... )

简介:   推送sdk (类似百度 推送 ) android  mina (待优化... )   本demo 研究的是原理,不要计较太多。。。。 至于token生成,service 保活,定时启动 不做说明。

 

推送sdk (类似百度 推送 ) android  mina (待优化... )

 

本demo 研究的是原理,不要计较太多。。。。 至于token生成,service 保活,定时启动 不做说明。

 

下载http://download.csdn.net/download/knight_black_bob/9823413

 

 


 

 

 

双开模拟器  进行验证。。。。


 
 
 

 

 

package cn.baoyou.curiousby.com.imsdk.service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

import com.alibaba.fastjson.JSON;

import org.apache.mina.core.session.IoSession;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import cn.baoyou.curiousby.com.imsdk.core.ClientSocket;
import cn.baoyou.curiousby.com.imsdk.core.ServerSocket;
import cn.baoyou.curiousby.com.imsdk.core.callback.IRecieveCallBack;
import cn.baoyou.curiousby.com.imsdk.message.Message;
import cn.baoyou.curiousby.com.imsdk.session.SessionManager;

/**
 * Created by cmcc-B100036 on 2017/4/18.
 */

public class MinaService extends Service{




    public static boolean send(Message msg){
        Log.i("baoy","--------------------");
        if (SessionManager.getInstance().isConnectable()){
            try {
                Log.i("baoy","write start" + msg.toString());
                SessionManager.getInstance().write(msg);
                Log.i("baoy","write end");
                return  true;
            } catch (Exception e) {
                return false;
            }
        }
        return false;
    }

    private IRecieveCallBack iRecieveCallBack = new IRecieveCallBack() {
        @Override
        public void recieve(Message msg) {
            Log.i("baoy","recievie msg ==== service " + msg.toString());
            Intent intent=new Intent();
            intent.setAction("cn.baoyou.curiousby.com.imsdk.msgrecieve");
            intent.putExtra("recieveMsg", JSON.toJSONString( msg));
            intent.putExtra("recieveMsgBytes",JSON.toJSONString( msg).getBytes());
            sendBroadcast(intent);
        }
    };


    public final class MinaBinder extends Binder {
        public MinaService getService() {
            return MinaService.this;
        }
    }


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    ClientSocket instance = null;
    ServerSocket instancee = null;
    @Override
    public void onCreate() {
        super.onCreate();
        ExecutorService  service =   Executors.newFixedThreadPool(2);
        service.execute(new Runnable() {
            @Override
            public void run() {
                instance = ClientSocket.getInstance();
                instance.setiRecieveCallBack(iRecieveCallBack);
                instance.init();
                IoSession ioSession = null;
                try {
                    instance.start();
                }catch (Exception e) {

                }
            }
        });
        service.execute(new Runnable() {
            @Override
            public void run() {
                instancee = ServerSocket.getInstance();
                instancee.init();
                IoSession ioSession = null;
                try {
                    instancee.start();
                }catch (Exception e) {

                }
            }
        });


        service.shutdown();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        instance.stop();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
    }





}

 

 

package cn.baoyou.curiousby.com.imsdk.broadcastreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.SyncStateContract;
import android.util.Log;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cn.baoyou.curiousby.com.imsdk.constants.Constants;
import cn.baoyou.curiousby.com.imsdk.message.Message;
import cn.baoyou.curiousby.com.imsdk.message.MessageFactory;
import cn.baoyou.curiousby.com.imsdk.operater.IMOriginalCallBack;

/**
 * Created by cmcc-B100036 on 2017/4/19.
 */

public class MsgReciever extends BroadcastReceiver {

    private IMOriginalCallBack iMOriginalCallBack;

    private static Map<Class,IMOriginalCallBack> map = new HashMap<>();

    public   MsgReciever setRecieve(Class clazz ,IMOriginalCallBack iMOriginalCallBack) {
         this.iMOriginalCallBack = iMOriginalCallBack;
        MsgReciever.map.put(clazz,iMOriginalCallBack);
        return this;
    }

    @Override
    public void onReceive(Context context, Intent intent) {

       if(Constants.ACTION .equals(intent.getAction())){
           String recieveMsg = intent.getStringExtra("recieveMsg");
           Log.i("baoy","=========msgrecieve==================="+recieveMsg);
           Message msg = MessageFactory.build(recieveMsg);
           for (   Map.Entry<Class,IMOriginalCallBack> entry : map.entrySet()) {
               Log.i("baoy","=========msgrecieve callback==================="+msg);
               Log.i("baoy","=========msgrecieve callback==================="+entry.getKey());
               Log.i("baoy","=========msgrecieve callback==================="+entry.getValue());
               ((IMOriginalCallBack) entry.getValue()).recieve(msg);
           }
       }

    }
}

 

package cn.baoyou.curiousby.com.imsdk.core;

import android.util.Log;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

import cn.baoyou.curiousby.com.imsdk.core.callback.IRecieveCallBack;
import cn.baoyou.curiousby.com.imsdk.core.callback.IReconnect;
import cn.baoyou.curiousby.com.imsdk.message.ConnectionMessage;
import cn.baoyou.curiousby.com.imsdk.message.Message;
import cn.baoyou.curiousby.com.imsdk.message.MessageFactory;
import cn.baoyou.curiousby.com.imsdk.message.ShortMessage;
import cn.baoyou.curiousby.com.imsdk.message.enums.MessageTag;
import cn.baoyou.curiousby.com.imsdk.session.SessionManager;


public class ClientHandler extends IoHandlerAdapter  {
   // private static Logger log = Logger.getLogger(ClientHandler.class);

    private IRecieveCallBack iRecieveCallBack;
    private IReconnect iReconnect;

    volatile static boolean isConnected = false;

    public ClientHandler(IReconnect iReconnect,IRecieveCallBack iRecieveCallBack) {
        this.iRecieveCallBack = iRecieveCallBack;
        this.iReconnect = iReconnect;
    }

    @Override
    public void sessionOpened(IoSession session) throws Exception {
        Log.i("baoy","session created opened");
        super.sessionOpened(session);
    }

    @Override
    public void sessionCreated(IoSession session) throws Exception {
        Log.i("baoy","session created start");
        super.sessionCreated(session);
        Log.i("baoy","session created  end");
        isConnected = true;
        buildConnection(session);
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        Log.i("baoy","session created closed");
        super.sessionClosed(session);
        isConnected = false;
    }

    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
        Log.i("baoy","session created sent");
        super.messageSent(session, message);
    }

    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
        Log.i("baoy","session created caught");
        super.exceptionCaught(session, cause);
        isConnected = false;

    }

    @Override
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
        Log.i("baoy","session created idle");
        super.sessionIdle(session, status);
    }

    @Override
    public void messageReceived(IoSession session, Object json)
            throws Exception {

        super.messageReceived(session, json);
        Log.i("baoy","recievie msg       00 === (" + json.toString() +")MessageFactory.isChecked(json.toString()"+MessageFactory.isChecked(json.toString()) );
        if(MessageFactory.isChecked(json.toString()).equals( MessageTag.msg)) {
            Log.i("baoy","recievie msg       01 === " );
            Message build = MessageFactory.build(json.toString());
            if (iRecieveCallBack != null) {
                Log.i("baoy", "recievie msg  1 ===" + json.toString());
                iRecieveCallBack.recieve(build);
                Log.i("baoy", "recievie msg  2 ===" + json.toString());
            }
        }
    }



    public void buildConnection(IoSession session){
         if(session.isConnected()) {
             ConnectionMessage msg = new ConnectionMessage();
             msg.setUserKey("2");
             msg.setJson("connect");
             session.write(com.alibaba.fastjson.JSON.toJSONString(msg));

         }
    }
}

 

package cn.baoyou.curiousby.com.imsdk.core;

import android.util.Log;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.filterchain.IoFilter;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import cn.baoyou.curiousby.com.imsdk.codec.CodecFactory;
import cn.baoyou.curiousby.com.imsdk.constants.Constants;
import cn.baoyou.curiousby.com.imsdk.core.callback.IRecieveCallBack;
import cn.baoyou.curiousby.com.imsdk.core.callback.IReconnect;
import cn.baoyou.curiousby.com.imsdk.message.ConnectionMessage;
import cn.baoyou.curiousby.com.imsdk.service.MinaService;


public class ClientSocket implements  IReconnect{

	IoConnector connector=null;
	
	private ClientSocket(){}
	private static ClientSocket instance = new ClientSocket();
	public static ClientSocket getInstance(){
		return instance;
	}

	private static IRecieveCallBack iRecieveCallBack;

	public static void  setiRecieveCallBack(IRecieveCallBack iRecieveCallBack) {
		ClientSocket.iRecieveCallBack = iRecieveCallBack;
	}

	public void init(){
		  connector = new NioSocketConnector();
		  ClientHandler handler = new ClientHandler(this,iRecieveCallBack);
		connector.setHandler(handler);

		IoFilter filter = new ProtocolCodecFilter(new CodecFactory());
		connector.getFilterChain().addLast("codec", filter);
		connector.getFilterChain().addLast("logging", new LoggingFilter());
	}
	public boolean start(){
		ConnectFuture connect = connector.connect(new InetSocketAddress(Constants.CLIENT_SOCKET_ADDRESS,Constants.CLIENT_SOCKET_PORT));
		connect.awaitUninterruptibly();
		return true;
	}



	public void stop(){
		if(connector != null){
			connector.dispose();
		}
	}


	@Override
	public void reconnection() {
		while(true) {

			if (!ClientHandler.isConnected) {
                 start();
			}

			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

 

package cn.baoyou.curiousby.com.imorginal;

import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import cn.baoyou.curiousby.com.imsdk.broadcastreceiver.MsgReciever;
import cn.baoyou.curiousby.com.imsdk.message.Message;
import cn.baoyou.curiousby.com.imsdk.message.ShortMessage;
import cn.baoyou.curiousby.com.imsdk.operater.IMOriginalCallBack;
import cn.baoyou.curiousby.com.imsdk.service.MinaService;

public class MainActivity extends AppCompatActivity implements View.OnClickListener ,IMOriginalCallBack{


    private EditText sendText;
    private TextView recieveText;

    private MsgReciever  reciever = new  MsgReciever().setRecieve(MainActivity.class , this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Intent intent =  new Intent(getApplicationContext(), MinaService.class);
        this.startService(intent);

        this.findViewById(R.id.bt_send_button).setOnClickListener(this);
        recieveText = (TextView) this.findViewById(R.id.id_recieveMsg);
        sendText = (EditText) this.findViewById(R.id.id_sendmsg);

    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bt_send_button:
                Log.i("baoy","=========================send"+sendText.getText().toString());
                ShortMessage shortMessage = new ShortMessage();
                shortMessage.setUserKey("2");
                shortMessage.setForm("2");
                shortMessage.setTo("1");
                shortMessage.setJson(sendText.getText().toString());

                blackboard +=  ""+((ShortMessage)shortMessage ).getForm()+"对" +((ShortMessage)shortMessage ).getTo() +" 说:"+shortMessage.getJson() +"\n";
                recieveText.setText(blackboard);

                MinaService.send(shortMessage);
                Log.i("baoy","========================");
                break;
        }
    }

    static String blackboard = "";
    @Override
    public void recieve(Message msg) {
        Log.i("baoy","=====main activity callback===================" + msg);
        blackboard +=  ""+((ShortMessage)msg ).getForm()+"对" +((ShortMessage)msg ).getTo() +" 说:"+msg.getJson() +"\n";
        recieveText.setText(blackboard);
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者 

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。

 

个人主页http://knight-black-bob.iteye.com/



 
 
 谢谢您的赞助,我会做的更好!

目录
相关文章
|
25天前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
160 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
6月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
94 10
|
6月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
174 0
|
3月前
|
Java Linux API
Android SDK
【10月更文挑战第21天】
149 1
|
4月前
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
96 7
|
5月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
96 20
Android经典面试题之图片Bitmap怎么做优化
|
4月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
96 4
|
3月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
5月前
|
Java Android开发 开发者
安卓应用开发中的线程管理优化技巧
【9月更文挑战第10天】在安卓开发的海洋里,线程管理犹如航行的风帆,掌握好它,能让应用乘风破浪,反之则可能遭遇性能的暗礁。本文将通过浅显易懂的语言和生动的比喻,带你探索如何优雅地处理安卓中的线程问题,从基础的线程创建到高级的线程池运用,让你的应用运行更加流畅。
|
5月前
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
103 2

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 4
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 5
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 8
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 9
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 10
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 1
    CompreFace:Star6.1k,Github上火爆的轻量化且强大的人脸识别库,api,sdk都支持
    21
  • 2
    【Azure Developer】编写Python SDK代码实现从China Azure中VM Disk中创建磁盘快照Snapshot
    17
  • 3
    【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
    27
  • 4
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    159
  • 5
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    160
  • 6
    【01】完整开发即构美颜sdk的uni官方uts插件—让所有开发者可以直接使用即构美颜sdk的能力-优雅草卓伊凡
    75
  • 7
    AutoTalk第十三期-应知必会的自动化工具-阿里云SDK支持策略(一)
    55
  • 8
    自动化AutoTalk第十期:应知必会的自动化工具-阿里云SDK
    54
  • 9
    API稳定安全最佳实践:用阿里云SDK为业务保驾护航
    94
  • 10
    如何接入电竞体育直播API或者SDK
    85