Android事件监听回调学习

本文通过实例介绍了Java中的回调机制,包括按钮点击事件监听器的实现方式,以及游戏调用SDK聚合框架API来间接调用渠道SDK生命周期方法的具体过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学习javaEE中servlet监听器的模块,与Android中事件监听回调进行对比理解,特地花点时间记录下来增强记忆。

1 接口回调步骤

(1)定义接口,接口方法
(2)在 X 类中创建接口成员变量,并对外暴露传入接口对象的方法
(3)在 X 类中对外暴露实现了接口方法的公共方法
(4)在 Y 类中调用 X 类中的公共方法,传入对应参数
(5)在 Z 类使用类中调用 X 类中传入接口对象的方法,即可收到回调,得到 Y 类中传入的信息


举个小栗子:

<span style="font-size:18px;">public interface OnClickListener {   ---------------------------------------------------</span><span style="font-family: Arial, Helvetica, sans-serif;font-size:18px;">>(1)</span><span style="font-size:18px;">
   
    public void OnClick(Button b);
 
}</span>

public class Button {   ----------------------------------------------------------------->X类
  OnClickListener listener;
 
  public void click() {   --------------------------------------------------------------->(3)
    listener.OnClick(this);
  }
  public void setOnClickListener(OnClickListener listener) {    ------------------------->(2)
    this.listener = listener;
  }
}

public class Activity {   --------------------------------------------------------------->Y、Z
  public Activity() {
  }
  public static void main(String[] args) {
    Button button = new Button();

    //<span style="white-space:pre">将接口对象OnClickListener 赋给 Button的接口成员</span>
    button.setOnClickListener(new OnClickListener(){    --------------------------------->(5)
       @Override
       public void OnClick(Button b) {
                 System.out.println("clicked");
       }   
    });

    button.click();        -------------------------------------------------------------->(4)
  }
}

甜点过后,到正餐了。拿之前做的聚合SDK框架生命周期回调部分举个栗子。

需求:游戏调用SDK聚合框架API,对应间接地调用到了渠道(如:360、豌豆荚SDK的生命周期方法)

public interface IActivityCallback {     ------------------------------------------------>(1)

    public void onActivityResult(int requestCode, int resultCode, Intent data);
    public void onCreate();
    public void onStart();
    public void onPause();
    public void onResume();
    public void onNewIntent(Intent newIntent);
    public void onStop();
    public void onDestroy();
    public void onRestart();
    public void onBackPressed();
    public void onConfigurationChanged(Configuration newConfig);
}

//SDK单例,相当于之前说的X类
public class FrameSDK {
	private static FrameSDK instance;
	private List<IActivityCallback>    mActivityCallbacks;
	
	private FrameSDK() {
        mActivityCallbacks = new ArrayList<>();
    }

    public static FrameSDK getInstance() {
        if (instance == null) {
            instance = new FrameSDK();
        }
        return instance;
    }
	
	public void setActivityCallback(IActivityCallback listener) {   -------------------------------------->(2)
        if (!mActivityCallbacks.contains(listener) && listener != null) {
            mActivityCallbacks.add(listener);
        }
    }

------------------------------------------------以下都是(3)--------------------------------------------------->(3)	
	public void onActivityResult(int requestCode, int resultCode, Intent data){
        if (mActivityCallbacks != null) {
            for (IActivityCallback callback  :mActivityCallbacks ) {
            	callback.onActivityResult(requestCode,resultCode,data);
            }
        }
    }

    public void onConfigurationChanged(Configuration newConfig){
        if (mActivityCallbacks != null){
            for (IActivityCallback callback  :mActivityCallbacks) {
                callback.onConfigurationChanged(newConfig);
            }
        }
    }

    public void onBackPressed() {
        if (mActivityCallbacks != null) {
            for (IActivityCallback callback  :mActivityCallbacks ) {
            	callback.onBackPressed();
            }
        }
    }

    public void onCreate() {
        if (mActivityCallbacks != null) {
            for (IActivityCallback callback  :mActivityCallbacks ) {
            	callback.onCreate();
            }
        }
    }

    public void onStart(){
        if (mActivityCallbacks != null) {
            for (IActivityCallback callback  :mActivityCallbacks ) {
            	callback.onStart();
            }
        }
    }

    public void onResume(){
        if (mActivityCallbacks != null) {
            for (IActivityCallback callback  :mActivityCallbacks ) {
                callback.onResume();
            }
        }
    }

    public void onPause() {
        if (mActivityCallbacks != null) {
            for (IActivityCallback callback  :mActivityCallbacks ) {
            	callback.onPause();
            }
        }
    }

    public void onStop() {
        if (mActivityCallbacks != null) {
            for (IActivityCallback callback  :mActivityCallbacks ) {
            	callback.onStop();
            }
        }
    }

    public void onDestroy() {
        if(mActivityCallbacks != null){
            for(IActivityCallback callback : mActivityCallbacks){
                callback.onDestroy();
            }

        }
    }

    public void onNewIntent(Intent newIntent) {
        if(mActivityCallbacks != null){
            for(IActivityCallback callback : mActivityCallbacks){
                callback.onNewIntent(newIntent);
            }

        }
    }

    public void onRestart() {
        if(mActivityCallbacks != null){
            for(IActivityCallback callback : mActivityCallbacks){
                callback.onRestart();
            }

        }

    }
}

渠道SDK进行的操作,相当于第(4)步
FrameSDK.getInstance().setActivityCallback(          ---------------------------------------------------(4)
					new ActivityCallbackAdapter() {

						public void onResume() {
							wandouGamesApi.onResume();
						}

						public void onPause() {
							wandouGamesApi.onPause();
						}

					});

其中ActivityCallbackAdapter是实现了IActivityCallback接口的适配器

现在,聚合SDK框架和渠道SDK的任务已经完成了,接下来看如何游戏如何调用

在游戏的主activity生命周期方法里面调用我们单例的生命周期方法,相当于第(5)步。这样,当游戏生命周期方法执行到时,就会调用对应渠道的生命周期方法。
public void onActivityResult(int requestCode, int resultCode, Intent data) {   -------------------------(5)
		FrameSDK.getInstance().onActivityResult(requestCode, resultCode, data);
		super.onActivityResult(requestCode, resultCode, data);
	}

	public void onStart() {
		FrameSDK.getInstance().onStart();
		super.onStart();
	}

	public void onPause() {
		FrameSDK.getInstance().onPause();
		super.onPause();
	}

	public void onResume() {
		FrameSDK.getInstance().onResume();
		super.onResume();
	}

	public void onNewIntent(Intent newIntent) {
		FrameSDK.getInstance().onNewIntent(newIntent);
		super.onNewIntent(newIntent);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值