在 android 上必须多次按下后退按钮才能关闭 activity 是什么意思?
What does it mean when backbutton has to be pressed many times for an activity to close on android?
我有一个 activity 只有在我按下硬件的后退按钮多次(或多或少 2 次)后才会关闭。
我已经尝试检测这种情况何时发生,我认为这一定是由于我正在使用的 IntentService 使用 broadcastReceiver 接收一些信息,但我不太确定,因为没有错误消息或警告正在显示。
有经验的人知道我必须多次按下 activity 中的后退按钮才能关闭它通常意味着什么吗?
我什至尝试覆盖 onBackPressed() 但它不起作用:
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
更新
所以我插入了 activity 的一些控制台日志 onCreate() 和 onDestroy() 所以看起来一旦在 activity 当我按下后退按钮时 activity 似乎被创建再次(再次调用 activity 的 onCreate())然后调用 onDestroy。
更新 2
这是我认为可能触发问题的方法:
private void startRestaurantsModelService(String url) {
if(restaurantsBroadcastReceiver == null){
//Intent to use RestaurantModel to getRestaurantsJsonArrays
Intent getRestaurants = new Intent(HomeActivity.this, RestaurantModel.class);
getRestaurants.putExtra("urlRestaurants", url);
startService(getRestaurants);
//The receiver that will receive restaurants list from RestaurantModel IntentService
restaurantsBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle restaurantsBundle = intent.getExtras();
//Assign Restaurants received from service
restaurants = (List<Restaurant>) restaurantsBundle.getSerializable("restaurantsList");
//Now that we have restaurants list configure the RecyclerView
recyclerViewConfiguration();
//We need to know number of open restaurants so we can use different layout settings
//for closed restaurants in adapter using getItemViewType()
numberOfOpenRestaurants = restaurantsBundle.getInt("numberOfOpenRestaurants");
restaurantAdapter.setNumberOfOpenRestaurants(numberOfOpenRestaurants);
//Then update the RecyclerView
updateRecyclerView();
if (loadingDialog.isShowing()) {
loadingDialog.dismiss();
}
}
};
registerReceiver(restaurantsBroadcastReceiver, new IntentFilter(RestaurantModel.BROADCAST_ACTION));
}
}
我正在取消注册 onPause 中的广播:
@Override
protected void onPause() {
super.onPause();
try {
unregisterReceiver(restaurantsBroadcastReceiver);
restaurantsBroadcastReceiver = null;
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
您可能希望确保 Activity 中的 onBackPressed() 未被覆盖。
谢谢大家指导!!!
解决了
在我的 startRestaurantsModelService()
中,我有一个调用 recyclerViewOnClickListener()
的方法 recyclerViewConfiguration()
看来是这个方法导致了错误,因为我设置了两次点击监听器:
@Override
public void recyclerViewOnClickListener() {
recyclerView.addOnItemTouchListener(
new RecyclerItemClickListener(this,
new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
if (restaurants.get(position).isOpen()) {
Intent i = new Intent(HomeActivity.this, MenuActivity.class);
i.putExtra("restaurant", restaurants.get(position));
i.putExtra("userAddress", address);
startActivity(i);
}
}
})
);
}
所以我在同一个 recyclerview 上设置了 2 个点击监听器,所以现在我做了一个布尔值来检查 recyclerview 是否已经有一个点击监听器,如果没有我设置它,如果为真我就不再设置它。
我有一个 activity 只有在我按下硬件的后退按钮多次(或多或少 2 次)后才会关闭。
我已经尝试检测这种情况何时发生,我认为这一定是由于我正在使用的 IntentService 使用 broadcastReceiver 接收一些信息,但我不太确定,因为没有错误消息或警告正在显示。
有经验的人知道我必须多次按下 activity 中的后退按钮才能关闭它通常意味着什么吗?
我什至尝试覆盖 onBackPressed() 但它不起作用:
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
更新
所以我插入了 activity 的一些控制台日志 onCreate() 和 onDestroy() 所以看起来一旦在 activity 当我按下后退按钮时 activity 似乎被创建再次(再次调用 activity 的 onCreate())然后调用 onDestroy。
更新 2
这是我认为可能触发问题的方法:
private void startRestaurantsModelService(String url) {
if(restaurantsBroadcastReceiver == null){
//Intent to use RestaurantModel to getRestaurantsJsonArrays
Intent getRestaurants = new Intent(HomeActivity.this, RestaurantModel.class);
getRestaurants.putExtra("urlRestaurants", url);
startService(getRestaurants);
//The receiver that will receive restaurants list from RestaurantModel IntentService
restaurantsBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle restaurantsBundle = intent.getExtras();
//Assign Restaurants received from service
restaurants = (List<Restaurant>) restaurantsBundle.getSerializable("restaurantsList");
//Now that we have restaurants list configure the RecyclerView
recyclerViewConfiguration();
//We need to know number of open restaurants so we can use different layout settings
//for closed restaurants in adapter using getItemViewType()
numberOfOpenRestaurants = restaurantsBundle.getInt("numberOfOpenRestaurants");
restaurantAdapter.setNumberOfOpenRestaurants(numberOfOpenRestaurants);
//Then update the RecyclerView
updateRecyclerView();
if (loadingDialog.isShowing()) {
loadingDialog.dismiss();
}
}
};
registerReceiver(restaurantsBroadcastReceiver, new IntentFilter(RestaurantModel.BROADCAST_ACTION));
}
}
我正在取消注册 onPause 中的广播:
@Override
protected void onPause() {
super.onPause();
try {
unregisterReceiver(restaurantsBroadcastReceiver);
restaurantsBroadcastReceiver = null;
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
您可能希望确保 Activity 中的 onBackPressed() 未被覆盖。
谢谢大家指导!!!
解决了
在我的 startRestaurantsModelService()
中,我有一个调用 recyclerViewOnClickListener()
recyclerViewConfiguration()
看来是这个方法导致了错误,因为我设置了两次点击监听器:
@Override
public void recyclerViewOnClickListener() {
recyclerView.addOnItemTouchListener(
new RecyclerItemClickListener(this,
new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
if (restaurants.get(position).isOpen()) {
Intent i = new Intent(HomeActivity.this, MenuActivity.class);
i.putExtra("restaurant", restaurants.get(position));
i.putExtra("userAddress", address);
startActivity(i);
}
}
})
);
}
所以我在同一个 recyclerview 上设置了 2 个点击监听器,所以现在我做了一个布尔值来检查 recyclerview 是否已经有一个点击监听器,如果没有我设置它,如果为真我就不再设置它。