Android:如何将回调传递给活动?

Dan*_*edo 5 java android callback android-activity

我正在创建一个库.它会创建一个活动,启动它,并在按下按钮后完成它.

按下按钮后,我想通过一个接口执行一些客户端代码.

也就是说,这个库的用户传入一个实现,我只是执行它.

类似的iOS代码将是:

MyViewController *vc = [[MyViewController alloc] init];
vc.callOnComplete = ...
[self presentViewController:vc animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

所需的代码是:

public interface SaveStuff {
    void save();
}
Run Code Online (Sandbox Code Playgroud)

在我的图书馆的活动中:

private SaveStuff saveStuff;
public void onButtonClicked(View v) {
    saveStuff.save() // client passes in saveStuff obj
    finish();
}
Run Code Online (Sandbox Code Playgroud)

我尝试过序列化.我创建了一个实现接口并且也实现了的类Serializable,并尝试将其传递并使用它进行提取getSerializableExtra.我最终获得了一个非序列化的异常.据我所知,这可能不是一个可行的解决方案,因为它意味着客户端必须在其实现中仅使用可序列化的类.如果我错了,请纠正我.在我的试验中,客户端活动显示在非序列化异常中.

我尝试过使用静态引用.基本上是全球州/单身人士.事实证明,根据诸如此类的各种答案:Java静态变量变为空,我不能依赖任何静态状态,并且任何与静态一起工作的解决方案只是巧合.

我没有尝试过简单地启动活动startActivityForResult,因为这需要我将我们接受的上下文作为参数投射到Activity.活动启动里面有这个库:

private void startNewActivity(int newVersion) {
    Intent i = new Intent(context, MyActivity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    context.startActivity(i); // context variable is passed in by the client
}
Run Code Online (Sandbox Code Playgroud)

如您所见,客户端传递上下文.我可以将上下文强制转换为一个Activity来调用startActivityForResult,但我不想这样做,因为我已经读过并不总是安全的.我可以要求Activity传入.这可能是一个合理的要求,但我不想去那里.

我看过现有的问题,而我没有尝试的是使用广播.如果我错误地想到这一点,请纠正我,但我能做的最好的事情是将对客户端接口实现的引用保持为广播接收器,然后在我创建的活动中发送广播.但是我担心接收器不会持续存在.如果我的库向用户显示活动,但用户在按下按钮之前杀死了应用程序,会发生什么?客户端代码的引用由上一个活动保存.按下按钮什么都不会发生?

我应该只是广播一条消息,并将其留给客户处理这些案件吗?客户如何处理这个?在app启动/关闭时注册一些东西?我是否必须强制用户执行此操作才能使用我的库?这合理吗?

更新:

事实证明,我们只是让图书馆中的活动访问单身人士.为了避免基于被杀死的活动等被擦除状态的所有问题,该库的用户将被要求在单例上运行'setup'方法,并在那里传递回调obj.他们将在某种基础Activity的onResume上运行它.在回答这个问题的自我回答之前,我会稍等一下,看看是否还有其他选择.

小智 0

为什么不在 android 上使用相同的流程,即 1)创建一个接口 2)在您的活动中声明接口的公共变量。3)用户在开始启动您的活动时将初始化该界面。4)使用接口变量来调用方法。