Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/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
Java 检测应用程序是否从其他活动返回MainActivity_Java_Android_Android Fragments_Android Activity - Fatal编程技术网

Java 检测应用程序是否从其他活动返回MainActivity

Java 检测应用程序是否从其他活动返回MainActivity,java,android,android-fragments,android-activity,Java,Android,Android Fragments,Android Activity,情景: 我的应用程序在 主要的活动是从网上下载一些东西。我用 OnStart(),因为我希望每当 用户打开应用程序,而不仅仅是在OnCreate() 应用程序有一个tablayout,不同选项卡的内容称为ViewPager的片段 这些片段包含自定义列表视图。单击listitem将调用一个新活动,显示有关给定项目的更多信息 项目。从带有 以下代码: : myListView.setOnItemClickListener( 新的AdapterView.OnItemClickListener(){

情景:

  • 我的应用程序在 主要的活动是从网上下载一些东西。我用
    OnStart()
    ,因为我希望每当 用户打开应用程序,而不仅仅是在
    OnCreate()
  • 应用程序有一个tablayout,不同选项卡的内容称为ViewPager的片段
  • 这些片段包含自定义列表视图。单击listitem将调用一个新活动,显示有关给定项目的更多信息 项目。从带有 以下代码:
:

myListView.setOnItemClickListener(
新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Intent myNewIntent=newintent(parent.getContext(),activity_details.class);
星触觉(myNewIntent);
}
});
我遇到的问题是,当用户通过按手机上的“后退”按钮从新打开的活动返回时,我的应用程序将返回到主活动,
OnStart()
方法将再次执行,因此应用程序将再次从internet下载内容,这是不希望的。(我只需要在用户打开应用程序时刷新)

这意味着我需要某种机制来表示我们正在从另一个活动中返回。我有两个想法:

  • 使用SharedReferences
  • 使用某种全局变量(不是这种想法的好朋友)
  • 数据库(呃……我不这么认为)
  • 在主活动中使用活动结果上的
    。乍一看,这听起来不错,但当我从片段中调用新活动时,它将实际的活动调用与我处理结果的地方分开,因此使代码复杂化

  • 请帮助我分享您的想法。

    它的内容是
    检测来自另一个活动的返回
    ,提示
    startActivityForResult()
    ;在调度事件时,这不会使任何事情复杂化,因此
    片段将得到通知:

    对于
    main活动

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        this.currentFragment.onActivityResult(requestCode, resultCode, data);
    }
    
    Intent data = new Intent();
    this.setResult(AppCompatActivity.RESULT_OK, data);
    this.finish();
    
    当然,当前的
    片段也需要在activityresult()上实现

    然后可以从
    DetailActivity
    返回数据:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        this.currentFragment.onActivityResult(requestCode, resultCode, data);
    }
    
    Intent data = new Intent();
    this.setResult(AppCompatActivity.RESULT_OK, data);
    this.finish();
    

    最简单的解决方案是活动变量。即使你不喜欢这种解决方案。我不知道您的体系结构是什么,但使用viewModel它是完全干净的。即使没有它,也很容易理解和维护

    像这样:

    private var syncToPerformed: Boolean = true
    
    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KeyEvent.KEYCODE_HOME) {
            syncToPerformed = true
        }
        return super.onKeyDown(keyCode, event)
    }
    
    override fun onCreate() {
        if (syncToPerformed) {
            // DO YOUR SYNCHRONISATION
           syncToPerformed = false
        }
    }
    

    此外,在该解决方案中使用onStart也没有用。

    为什么不使用一个接口,并覆盖
    onBackPressed
    ,这样它会通过接口向
    MainActivity
    发送“嘿,我回来了,所以不要下载任何东西”

    碎片

    public class itemFragment extends Fragment {
    
        private OnFragmentInteractionListener mListener;
    
        public itemFragment() {
            // Required empty public constructor
        }
    
    
        public static itemFragment newInstance() {
            return new itemFragment();
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_item, container, false);
        }
    
        // TODO: Rename method, update argument and hook method into UI event
    
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            if (context instanceof OnFragmentInteractionListener) {
                mListener = (OnFragmentInteractionListener) context;
            } else {
                throw new RuntimeException(context.toString()
                        + " must implement OnFragmentInteractionListener");
            }
        }
    
        @Override
        public void onDetach() {
            super.onDetach();
            //send true to Main Activity before detaching
            mListener.onFragmentInteraction(true);
            mListener = null;
        }
    
    
        public interface OnFragmentInteractionListener {
    
            void onFragmentInteraction(Boolean iamBack);
        }
    }
    
    主要活动

    public class MainActivity extends AppCompatActivity implements itemFragment.OnFragmentInteractionListener {
        boolean backPress = false;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            //Download whatever you want if backPress is false
            if (!backPress) {
    
            }
        }
    
        @Override
        public void onFragmentInteraction(Boolean backPress) {
            this.backPress = backPress;
        }
    }
    

    注意:我仍然没有尝试过,所以如果您遇到任何问题,请告诉我。

    我认为使用SharedReference将是一个很好的解决方案。您可以在不希望触发同步代码的活动中的
    onBackPressed()
    方法中设置一个值,然后在MainActivity的
    onStart()
    方法中检查该值,如果该值指示您正在从不希望执行同步的状态返回,则重置该值。您可能会发现在返回时不希望同步的其他状态(可能是配置更改),并使用相同的设置

    如果您需要知道这是否是第二次启动,只需使用一个标志。默认为false,在调用onStart时将其设置为true,并在下次调用onStart时进行检查。@Gabetechan如果通过按home按钮退出应用程序并再次启动应用程序,则我需要刷新。但是我不知道用户是否从
    活动\u详细信息
    活动返回。因此,一个简单的标志不起作用。点击主页不会退出应用程序。我建议你称之为“离开”,否则你会把自己搞糊涂的。似乎您希望在onCreate中触发此行为,而不是从描述中的onStart。是的,可能“离开”是一个更好的术语。因此,如果用户“启动”应用程序,那么我需要刷新,并且每次用户使用“主页”按钮“离开”应用程序后重新启动(“返回”)应用程序时,我都需要刷新。在应用程序重新启动时,OnCreate未被调用,因此我无法将我的刷新例程放在那里。您介意解释一下为什么我需要在片段中使用onActivityResult吗?我猜如果我从片段中调用一个新的意图,那么一旦新活动完成,它将返回到mainActivity。(当我说它很复杂的时候,我的意思是,当我从一个片段调用DetailActivity时,我的MainActivity中有一个OnActivityResult可能会让人困惑。但这可能是标准过程,我只是Java和Android的新手)你能分享一些关于这方面的代码吗?我对Android和Java都是新手,所以我不确定你到底是什么意思。@Istvanb我肯定我会尽快感谢你给我回代码。我还没有尝试过,但我确切地知道你在这里用接口做什么——顺便说一句——我正在实现一个片段和我的MainActivity之间通信的完全相同的方法。在您的代码(以及我正在使用的代码)中,我不明白的是,当您将接口实例转换到上下文中时,它到底意味着什么。这个解决方案工作得很好,但我不理解背后的概念。@Istvanb你能告诉我我正在将接口转换成上下文的代码吗:/ups,实际上是另一种方式,你将上下文转换成接口
    mListener=(OnFragmentInteractionListener)上下文这是完全不同的事情。尽管如此,我还是不明白将上下文转换到接口到底意味着什么——当然很容易实现(我已经知道了)