zoukankan      html  css  js  c++  java
  • 十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象

    一、通过广播方式:

    1、比如登录。假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象传入即可。但是在Activity中不能传递监听对象,所以考虑使用广播来实现。

    复制代码
    public void login(final LoginOnClickListener listener) {
            Intent intent = new Intent(context, LoginActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            BroadcastReceiver mReceiver = new BroadcastReceiver() {
                public void onReceive(Context context, Intent intent) {
                    listener.handleLogin(true, "receiver .. BroadcastReceiver .. ");
                }
            };
            IntentFilter intentFilter = new IntentFilter("android.intent.action.MAIN");
            context.registerReceiver(mReceiver, intentFilter);
            context.startActivity(intent);
    }
    复制代码

    2、在LoginActivity类中登录成功之后,发送一个广播通知登录成功。

     Intent intent = new Intent("android.intent.action.MAIN");  
     sendBroadcast(intent);

    参考:http://buddie.iteye.com/blog/977352

    二、通过静态对象:

      我在做项目时遇到一个问题,第三方调用的SDK,我的sdk里面有一个登录方法,在登录方法里面又启动一个sdk里面的登录界面,用户登录成功之后,怎样通知登录方法即第三方。后来想到了广播,如第一种方式是可以的。

         后来看到别人代码中采用静态对象,然后我试了以下这种方式也可以。因为静态对象不管所在类创建多少个对象,它都是不变的。下面是具体实现:

    复制代码
    public class SDKLibPlatform {
        private Activity context;
        private SDKLibPlatform() {
        }
        private static SDKLibPlatform platform = new SDKLibPlatform();
    
        public static SDKLibPlatform getInstance() {
            if (platform == null) {
                return new SDKLibPlatform();
            }
            return platform;
        }
    
        public static Callback listener;
        /**
         * 登录方法
         * 
         * @param listener
         *            回调函数
         */
        public void login(Callback callback) {
            //将这个回调函数保存在listener对象上
            listener = callback;
            Intent intent = new Intent(context, LoginActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            //启动activity
            context.startActivity(intent);
        }    
          SDKLibPlatform.listener.handle(false, "login ....... ");
        public interface Callback {
            public void handle(boolean status, String message);
        }
    }
    复制代码

      启动LoginActivity之后,在用户登录成功或者失败是调用 listener 对象的handle方法,从而可以通知到第三方。

    if (code==1) { //登录成功
        SDKLibPlatform.listener.handle(true, "login success ....... ");
    }else {
        SDKLibPlatform.listener.handle(false, "login false ....... ");
    }

    第三方调用的代码:

    SDKLibPlatform.getInstance().login(new Callback(){
                                    @Override
                                    public void handle(boolean status,String message) {
                                        System.out.println(status+" -====================> "+message);  
                                    }
                                });
  • 相关阅读:
    大众CAN TP2.0协议说明
    统一诊断服务 (Unified diagnostic services , UDS) (七)
    统一诊断服务 (Unified diagnostic services , UDS) (六)
    统一诊断服务 (Unified diagnostic services , UDS) (五)
    统一诊断服务 (Unified diagnostic services , UDS) (四)
    统一诊断服务 (Unified diagnostic services , UDS) (三)
    asp.net 网页拉伸 到300%不变形方法一
    C# WinForm 禁止最大化、最小化、双击标题栏、双击图标等操作记录
    VS系列软件中debug和release编译环境有什么区别
    软件设计开发思想总结
  • 原文地址:https://www.cnblogs.com/liyuzhao/p/3783616.html
Copyright © 2011-2022 走看看