意图的 AtomicReferences 和帮助文件中的 Activity 导航
AtomicReferences for Intents and Activity Navigation in Helper File
在我的应用程序中,我在大约 5 个不同的屏幕之间导航,每个屏幕都有自己的 activity
。几乎任何 activity
都可以从任何其他 activity
调用,所以我正在尝试构建一个帮助文件来管理 intents
,这样我就没有冗余代码了。
我用 public static
方法构建了一个帮助文件,并在调用这些方法时传递 activity context
和任何所需的数据。这似乎在我的设备 (Samsung 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);
}
}
我完全看不出您需要在任何 static
方法中使用 AtomicReference
的任何理由。
另一种方法是创建一个 BaseActivity
class 来扩展 AppCompatActivity
并包含所有辅助方法。然后,您的所有活动都应扩展 BaseActivity
。在这种情况下,您不需要将 Context
传递给所有这些辅助方法,因为辅助方法将是非静态的,并且可以将 this
用作 Context
。
在我的应用程序中,我在大约 5 个不同的屏幕之间导航,每个屏幕都有自己的 activity
。几乎任何 activity
都可以从任何其他 activity
调用,所以我正在尝试构建一个帮助文件来管理 intents
,这样我就没有冗余代码了。
我用 public static
方法构建了一个帮助文件,并在调用这些方法时传递 activity context
和任何所需的数据。这似乎在我的设备 (Samsung 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);
}
}
我完全看不出您需要在任何 static
方法中使用 AtomicReference
的任何理由。
另一种方法是创建一个 BaseActivity
class 来扩展 AppCompatActivity
并包含所有辅助方法。然后,您的所有活动都应扩展 BaseActivity
。在这种情况下,您不需要将 Context
传递给所有这些辅助方法,因为辅助方法将是非静态的,并且可以将 this
用作 Context
。