【问题标题】:What does it mean when backbutton has to be pressed many times for an activity to close on android?当必须多次按下后退按钮才能在android上关闭活动时,这意味着什么?
【发布时间】:2015-11-19 16:20:45
【问题描述】:

我有一个活动,只有在我多次按下硬件的后退按钮(或多或少 2 次)后才会关闭。

我已尝试检测何时发生这种情况,我认为这一定是由于我正在使用的 IntentService 使用广播接收器接收一些信息,但我不太确定,因为没有显示错误消息或警告.

有没有更多经验的人知道这通常意味着我必须在活动中按多次后退按钮才能关闭它?

我什至尝试覆盖 onBackPressed() 但它不起作用:

@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}

更新

所以我插入了一些控制台日志 onCreate() 和 onDestroy() 活动,所以似乎一旦在活动中,当我按下返回按钮时,活动似乎再次被创建(再次调用活动的 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();
    }
}

【问题讨论】:

  • 回栈中有分片交易吗?
  • 这通常意味着你要么在片段后栈上有东西,要么你有几个活动,可能相同,堆叠在一起

标签: android android-activity android-service android-broadcast android-intentservice


【解决方案1】:

您可能希望确保 onBackPressed() 在您的 Activity 中没有被覆盖。

【讨论】:

  • 好吧,我的第二个猜测是,在您尝试回击时,您可能已经运行了多个 Activity 实例。你认为可能是这种情况?
  • 是否有办法检查是否有多个活动实例正在运行?
  • adb shell dumpsys 活动会有所帮助。
  • 您是否为您的活动设置了任何标志?我也认为它不止一个 Activity 实例
  • @n.m.生病尝试在活动 onCreate() 上创建控制台日志
【解决方案2】:

谢谢大家的指导!!!

解决了

在我的startRestaurantsModelService() 中,我有方法recyclerViewConfiguration() 调用recyclerViewOnClickListener()

似乎是这个方法导致了错误,因为我设置了两倍的点击监听器:

 @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 是否已经有一个点击侦听器,如果没有我设置它,如果为 true,那么我不再设置它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多