帮助文件中意图和活动导航的 AtomicReferences

Posted

技术标签:

【中文标题】帮助文件中意图和活动导航的 AtomicReferences【英文标题】:AtomicReferences for Intents and Activity Navigation in Helper File 【发布时间】:2016-12-14 05:34:12 【问题描述】:

在我的应用程序中,我在大约 5 个不同的屏幕之间导航,每个屏幕都有自己的activity。几乎任何activity 都可以从任何其他activity 调用,所以我正在尝试构建一个帮助文件来管理intents,这样我就没有多余的代码了。

我使用public static 方法构建了一个帮助文件,并在调用这些方法时传递了活动context 和任何所需的数据。这似乎在我的设备(三星 Galaxy S5)上运行良好,但 android Studio 建议在我的帮助文件中创建我的意图 AtomicReference。

你能帮我理解这些是否以及为什么应该是AtomicReference<Intent>

另外,将context 传递给帮助文件以进行这些调用是否合适?

ActivityHelper 文件:

public class ActivityHelper 
private ActivityHelper() 

public static void startAddNewMealActivity(Context context) 
    Intent newMealIntent = new Intent(context, MealEditActivity.class);
    context.startActivity(newMealIntent);


public static void startMealListActivity(Context context) 
    Intent intent = new Intent(context, MealListActivity.class);
    context.startActivity(intent);


public static void startEditMealActivity(Context context, FBMeal meal, String mealFBKey) 
    Intent intent = new Intent(context, MealEditActivity.class);
    intent.putExtra(Constants.INTENT_FB_KEY_EXTRA_TAG, mealFBKey);
    intent.putExtra(Constants.INTENT_MEAL_EXTRA_TAG, meal);
    context.startActivity(intent);


public static void startEditLastMealActivity(final Context context) 

    FBHelper.getQueryForMostRecentMeal().addListenerForSingleValueEvent(new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
            if (FBHelper.isExistingDataSnapshop(dataSnapshot)) 

                for (DataSnapshot snapshot : dataSnapshot.getChildren()) 
                    FBMeal selectedMeal = snapshot.getValue(FBMeal.class);
                    String selectedMealId = snapshot.getKey();
                    startEditMealActivity(context, selectedMeal, selectedMealId);
                
             else 
                Utils.showToastFromStringResource(R.string.no_meals, context);
            
        

        @Override
        public void onCancelled(DatabaseError databaseError) 
            Utils.showToastFromStringResource(R.string.error_getting_meal, context);
        
    );


AppCompatActivity 中从菜单调用帮助文件示例:

@Override
public boolean onOptionsItemSelected(MenuItem item) 
    switch (item.getItemId()) 
        case R.id.edit_meal_menu:
            ActivityHelper.startEditMealActivity(this, meal, mealFBKey);
            return true;
        case R.id.edit_last_entry_menu:
            ActivityHelper.startEditLastMealActivity(this);
            return true;
        case R.id.about_menu:
            DialogFragment newFragment = AboutDialog.newInstance();
            newFragment.show(getFragmentManager(), "about");
        default:
            return super.onOptionsItemSelected(item);
    

【问题讨论】:

另一种方法是创建一个扩展AppCompatActivity 并包含所有辅助方法的BaseActivity 类。然后,您的所有活动都应扩展BaseActivity。在这种情况下,您不需要将Context 传递给所有这些辅助方法,因为辅助方法将是非静态的,并且可以将this 用作Context 而且我完全看不出为什么您需要在您的任何static 方法中使用AtomicReference 谢谢,@DavidWasser。我按照您的建议将我的帮助文件重建为BaseActivity。这更清洁,更易于管理。我仍然不确定为什么 Android Studio 会建议 AtomicReference,但无论哪种方式都可以正常工作。 很高兴听到这个消息。我发布了我的 cmets 作为答案。也许它会帮助别人。 【参考方案1】:

我完全看不出为什么您需要在任何static 方法中使用AtomicReference

另一种方法是创建一个扩展AppCompatActivity 并包含所有辅助方法的BaseActivity 类。然后,您的所有活动都应扩展BaseActivity。在这种情况下,您不需要将Context 传递给所有这些辅助方法,因为辅助方法将是非静态的,并且可以将this 用作Context

【讨论】:

以上是关于帮助文件中意图和活动导航的 AtomicReferences的主要内容,如果未能解决你的问题,请参考以下文章

如何在导航抽屉中添加活动

如何从活动意图到特定片段

3.5 意图Intent的概念

我正在尝试使用意图导航到多个活动,但我遇到了运行时异常,我是 eclipse 的初学者,所以请指导我

android意图片段到活动有错误

启动谷歌地图意图后返回活动