Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 用户通知需要上下文_Android_Android Context - Fatal编程技术网

Android 用户通知需要上下文

Android 用户通知需要上下文,android,android-context,Android,Android Context,为了通知用户,我使用AlertDialog或Snanckbar。它们都需要活动上下文才能显示。三个案例: 从当前活动生成的消息:这是微不足道的 从另一个线程生成的消息:我正在实现一个广播/接收器模式,以便线程可以广播消息,活动接收并显示消息 关闭活动生成的消息,例如活动主控启动活动选择器,用户选择一个选项,代码执行一些操作,然后返回主控 // Selector activity draft sample mButtonSeelcted.setOnClickListener(new OnClic

为了通知用户,我使用AlertDialog或Snanckbar。它们都需要活动上下文才能显示。三个案例:

  • 从当前活动生成的消息:这是微不足道的
  • 从另一个线程生成的消息:我正在实现一个广播/接收器模式,以便线程可以广播消息,活动接收并显示消息
  • 关闭活动生成的消息,例如活动主控启动活动选择器,用户选择一个选项,代码执行一些操作,然后返回主控

    // Selector activity draft sample
    mButtonSeelcted.setOnClickListener(new OnClickListener() {
    @Override
      public void onClick(View view) {
        super.onClick(view);
        doMagicForSelected();
        mContext.sendBroadcast(intentForUserMessage);
        mContext.startActivity(intentToMasterActivity);
      }
    });
    
现在不显示该消息,因为在接收器启动时,选择器活动已完成。此外,它还提供了一个WindowLeaked异常,因为AlertDialog从未被解除

有什么想法吗?有没有我遗漏的模式

  • 使用startActivityForResult()从活动(活动A)启动选择器活动(活动B)
  • 根据结果显示主活动中的对话框
  • 我正在实现一个广播/接收器模式,以便线程可以广播消息,活动接收并显示消息

    请使用进程内消息总线(例如,
    LocalBroadcastManager
    ,greenrobot的事件总线)。使用系统广播不仅会浪费CPU和电池,还会带来安全问题(例如,任何应用程序都可能监视您的消息)

    有没有我遗漏的模式


    在第三个场景中,“主活动”负责显示此信息,而不是正在销毁的活动。因此,将信息添加到传递给
    startActivity()
    Intent
    中,告诉“主活动”显示该信息。

    感谢性能/安全提示:)如果doMagicGorSelected方法获得可向用户广播的验证(例如网络问题),则它将广播该消息。这种方法不知道主人的情况。我想我的重点是,我应该如何处理上下文不稳定且在使用时可以销毁/更改的事实。@denispyr:“我想我的重点是,我应该如何处理上下文不稳定且在使用时可以销毁/更改的事实”——如果主控器是显示对话框或snackbar的主控器,那么就没有波动,所以我不理解这种担忧。让我澄清一下。关于我的草稿代码,如果'doMagicForSelected()得到一个“可显示”的异常(例如错误输入),它将广播该消息。选择器活动将接收它并显示一个对话框。如果这是在onLoadFinished期间发生的,则不会出现问题,对话框将显示。如果它发生在活动结束之前,那么我就有麻烦了。这个案例有什么模式可以遵循吗?@denispyr:最有可能的答案是“不要显示错误”。有一些关于
    活动的方法,例如
    isDestroyed()
    isFinishing()
    ,可以用来帮助检测此问题。或者,更好的方法是,当您切换到事件总线时,只在您能够对事件进行操作时才关注事件(例如,在
    onStart()
    中注册事件,在
    onStop()
    中注销事件)。我确实使用onResume/onPause来注册/注销事件。我将尝试您建议的isXxx方法,并可能重构代码。谢谢。