【问题标题】:How to access another activity?如何访问另一个活动?
【发布时间】:2016-11-15 02:30:41
【问题描述】:

澄清一下,this 不是我想要的。我想访问另一个 Activity 的上下文。

假设我有两个活动,MainActivityWebActivity。在MainActivity 中我使用oAuth2 登录,登录后我启动WebActivity。在WebActivity 我需要使用mTencent.logout(MainActivity.this); 功能注销,问题是如何从WebActivity 访问MainActivity

如果我直接这样做,我会得到错误,

MainActivity 不是封闭类?

考虑到我是android的初学者,这里可能不是实现它的确切方法。

有人会帮忙吗?谢谢!

API:void com.tencent.tauth.Tencent.logout(Context context)

【问题讨论】:

  • 为什么logout 函数特别需要MainActivity 的上下文?
  • 它是那个 oauth2 登录的 api,我只是调用 api 文档。如果我在 MainActivity 中调用该函数,它可以正常工作。
  • 您能否提供一些代码来说明您是如何登录的?我之前没有做过太多的 oAuth2 身份验证,但是必须指定 Activity 上下文而不仅仅是常规的 Context 似乎很奇怪。
  • 因为logout 只需要Context,只需将WebActivity 的上下文传递给它即可。 mTencent.logout(this)
  • 您是否尝试过在登录和注销时都传递Application 上下文?

标签: android android-activity android-fragmentactivity


【解决方案1】:

loginlogout 方法中使用 Application 上下文。因为它们将在应用程序级别进行管理。

所以将mTencent.logout(MainActivity.this); 更改为mTencent.logout(getApplicationContext());

还要更改您的 login 方法以在应用程序上下文中工作。

【讨论】:

    【解决方案2】:

    而不是在另一个活动中使用一个活动的上下文,这有时可能会导致崩溃。
    您可以使用EventBus 之类的库来链接代码。

    定义一个实现你想要执行的事件的类,例如:LogOutEvent.java

    public static class LogOutEvent { /* Additional fields if needed */ }
    

    你可以使用以下命令从 WebViewActivity.java 发布诸如注销之类的事件

    EventBus.getDefault().post(new LogOutEvent());
    

    MainActivity中你首先需要注册事件总线

    @Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }
    
    @Override
    public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }
    

    然后在 MainActivity 你可以订阅这样的事件

    @Subscribe(threadMode = ThreadMode.MAIN)  
    public void onMessageEvent(LogOutEvent event) {/* Do log out here */};
    

    【讨论】:

      【解决方案3】:

      对于您的问题,有一个很好的实践解决方案,其中涉及要执行的某些步骤:

      1- 定义接口:

      public interface LogOutInterface {
        public void logout();
      }
      

      2- 让您的MainActivity 实现此接口:

      public class MainActivity extends ???? implements LogOutInterface {
        ...
      
        @Override
        public void logout(){
          //your logout procedure
        }
      }
      

      3- 为您的WebActivity 提供一个公共方法并允许它接受LogOutInterface

      public class WebActivity ... {
        private LogOutInterface logoutInterface;
        ...
      
        public void setLogOut(LogOutInterface logoutInterface) {
           this.logoutInterface = logoutInterface;
        }
      }
      

      4- 从MainActivity 调用setLogOut

      public class MainActivity ... {
      
         public void yourmethod() {
            ...
            webActivity.setLogOut(this);
         }
      }
      

      5- 从您的WebActivity 调用注销功能:

      public class WebActivity ... {
         ... 
         public void yourmethod() {
            logoutInterface.logout();
         }
      }
      

      希望这会有所帮助。

      【讨论】:

      • 当我实现你的问题时,我遇到了错误,非静态方法 'setLogOut(com.xxx.defaultapplication.LogOutInterface)' 在第四步中无法从静态上下文中引用。与问题stackoverflow.com/questions/4922145/… 相同。如果我作为答案实现stackoverflow.com/a/4922186/6521116 我会在 WebActivity.yourmethod() 处得到 java.lang.NullPointerException
      • @KrisRoofe 注意 webActivity 是类 WebActivity 的实例而不是类本身
      【解决方案4】:

      这是一个可行的。 在 MainActivity 中,public static Activity thisActivity; & thisActivity = this; 然后在 WebActivity 中 mTencent.logout(MainActivity.thisActivity);

      或者只是可以将注销功能作为MainActivity的公共静态函数,

      public static void logout() {
          if (mTencent.isSessionValid()) {
              mTencent.logout(thisActivity);
          }
      }
      

      然后从 WebActivity 调用 MainActivity.logout()

      【讨论】:

        猜你喜欢
        • 2011-04-02
        • 1970-01-01
        • 2016-01-17
        • 1970-01-01
        • 2013-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多