我是Android和Firebase云消息传递MVP模式的新手。我有一个应用程序接收从Firebase控制台发送的FCM通知。
为了测试应用,我已使用FirebaseAuth将用户添加到Firebase,并使用电子邮件和密码身份验证。电子邮件和FCM令牌正在保存到SharedPreferences并正在接收通知。
问题:我现在需要从SharedPreferences
和FCM令牌发送电子邮件到我的应用服务器。我在网上阅读了很多关于从SharedPreferences
和Context
检索数据的内容,但我仍然不能把它们放在一起。
我收到错误消息,指出方法getInstance(this)
无法应用于LoginPresenter.java
(请查看下面的代码段)。我很确定我做错了什么。请大家,指出我正确的方向。
public class LoginPresenter implements LoginContract.Presenter, LoginInteractor.Callback {
@Override
public void onAuthSuccess() {
//Show notifications
mLoginView.showPushNotifications();
//Get master token before sending it to the server
String savedToken = FirebaseInstanceId.getInstance().getToken();
//TODO:Check if token is not null.
//Get user email
final String savedEmail = SharedPrefManager.getInstance(this).getUserEmail();
saveTokenToServer(savedEmail, savedToken);
}
我使用以下类来管理SharedPreferences:
public class SharedPrefManager {
private static final String SHARED_PREF_NAME = "FCMSharedPref";
private static final String TAG_EMAIL = "tagemail";
private static SharedPrefManager mInstance;
private static Context mCtx;
private SharedPrefManager(Context context) {
mCtx = context;
}
public static synchronized SharedPrefManager getInstance(Context context) {
if (mInstance == null) {
mInstance = new SharedPrefManager(context);
}
return mInstance;
}
//this method will save the email to shared preferences
public boolean saveDeviceEmail(String email) {
SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(TAG_EMAIL, email);
editor.apply();
return true;
}
//this method will fetch the device token from shared preferences
public String getUserEmail() {
SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
return sharedPreferences.getString(TAG_EMAIL, null);
}
}
提前谢谢
答案 0 :(得分:0)
您使用的是SharedPref错误。我无法提供比Android Developer的页面中提供的更简单的答案:
初始化SharedPrefs:
Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
getString(R.string.preference_file_key), Context.MODE_PRIVATE);
写入SharedPrefs:
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.apply();
要从共享首选项文件中检索值,请调用此类方法 作为getInt()和getString(),提供所需值的键, 如果密钥不存在,则可选择返回默认值。对于 例如:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);
答案 1 :(得分:0)
这是一些示例代码。
SharedPreferences sharedPref = MainActivity.this.getPreferences(Context.MODE_PRIVATE);
fileIncrementer = sharedPref.getInt("incrementor", 0);
fileIncrementer++;
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt("incrementor", fileIncrementer);
editor.commit();
答案 2 :(得分:-1)
当您初始化context
或使用Dagger注入时,您需要从Activity
传递presenter
。
为了方便(我怀疑你没有使用依赖注入) - 在你的演示者中创建一个Constructor
,它带有一个Context
参数,可以为你提供Context
使用
像这样。
private Context mContext;
public LoginPresenter (Context context){
mContext = context
}
@Override
public void onAuthSuccess() {
mLoginView.showPushNotifications();
String savedToken = FirebaseInstanceId.getInstance().getToken();
final String savedEmail = SharedPrefManager.getInstance(mContext).getUserEmail(); //See context used here
saveTokenToServer(savedEmail, savedToken);
}