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下载内容,这是不希望的。(我只需要在用户打开应用程序时刷新)
这意味着我需要某种机制来表示我们正在从另一个活动中返回。我有两个想法:
。乍一看,这听起来不错,但当我从片段中调用新活动时,它将实际的活动调用与我处理结果的地方分开,因此使代码复杂化
请帮助我分享您的想法。它的内容是
检测来自另一个活动的返回
,提示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)上下文代码>这是完全不同的事情。尽管如此,我还是不明白将上下文转换到接口到底意味着什么——当然很容易实现(我已经知道了)