Android - 在共享首选项中点击通知保存字符串
Android - on click notification save string in Shared Preferences
我在 Android 开发方面仍然不是很好,我正在尝试弄清楚如何在之后触发某些操作(在我的情况下,我想在共享首选项中保存一个变量)我单击 Android 中的通知。
我目前有这个代码:
private void startForegroundService() {
Log.d(TAG, "Start " + NOTIFICATION_CHANNEL_NAME + " foreground service");
setNotificationLanguage();
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(getResourceIdForResourceName(this, "ic_stat_show_chart"))
.setSound(null)
.setContentTitle(NOTIFICATION_CHANNEL_NAME)
.setContentText(NOTIFICATION_CHANNEL_DESC)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent);
Notification notification = builder.build();
}
当我单击通知时,我启动了 MainActivity class,这也是我想要的。但我还想在单击通知时在共享首选项中保存一个字符串。我已经搜索过但一无所获。如果有人可以提供帮助,我将不胜感激。谢谢:)
尝试在您的主要活动中执行以下操作:
Intent intent = getIntent();
if (intent.hasExtras()){
//Saved notification has been clicked to shared preferences
}
希望这可能有所帮助
你可以给intent传递参数,在MainActivity中检查intent是否有参数
Passing arguments to intent android
在 notificationIntent
中添加您想要将 sharedpref 另存为额外的字符串值,如下所示。
notificationIntent.putExtra("Key","Value");
您将能够在 Activity 的 onCreate
中提取它。
String value = getIntent().getStringArrayExtra("Key");
注意:如果你只是想知道activity是否被通知打开,只需在intent中传递任何常量值并检查你是否在onCreate
使用上述方法,这样您就可以确定 activity 是通过通知启动的。只要确保在那种情况下不要使用相同的 key/value 组合作为相同的 activity 意图的额外组合,以便从通知 pendingIntent 流以外的任何其他地方启动它。
正如 Keshav 所解释的,您可以从意图中获取数据并将其存储在 sharedpreferences 中,这里是 SharedPreferenceHelper class。
public class SharedPreferenceHelper {
private static final String STRING_NAME = "your_string_name";
public SharedPreferenceHelper(Context context) {
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
}
public void setString(String your_string){
mPreferences.edit().putString(STRING_NAME,your_string).apply();
}
public String getString(){
return mPreferences.getString(STRING_NAME,null);
}
}
在 MainActivity 中,
public class MainActivity extends AppCompatActivity{
Bundle mBundle;
SharedPreferenceHelper mSharedPreferenceHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSharedPreferenceHelper = new SharedPreferenceHelper(this);
mBundle = getIntent().getExtras();
if(mBundle != null){
mSharedPreferenceHelper.setString(mBundle.getString("your_string_data"));
}
}
如果 activity 已经创建,
@Override
protected void onResume() {
super.onResume();
if(mBundle != null){
mSharedPreferenceHelper.setString(mBundle.getString("your_string_data"));
}
}
enter code here
如果您有任何问题,请告诉我。
重写 MainActivity 中的 onNewIntent 方法
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("KEY", "str value"); //change this according to your need
editor.apply();
}
我在 Android 开发方面仍然不是很好,我正在尝试弄清楚如何在之后触发某些操作(在我的情况下,我想在共享首选项中保存一个变量)我单击 Android 中的通知。
我目前有这个代码:
private void startForegroundService() {
Log.d(TAG, "Start " + NOTIFICATION_CHANNEL_NAME + " foreground service");
setNotificationLanguage();
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(getResourceIdForResourceName(this, "ic_stat_show_chart"))
.setSound(null)
.setContentTitle(NOTIFICATION_CHANNEL_NAME)
.setContentText(NOTIFICATION_CHANNEL_DESC)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent);
Notification notification = builder.build();
}
当我单击通知时,我启动了 MainActivity class,这也是我想要的。但我还想在单击通知时在共享首选项中保存一个字符串。我已经搜索过但一无所获。如果有人可以提供帮助,我将不胜感激。谢谢:)
尝试在您的主要活动中执行以下操作:
Intent intent = getIntent();
if (intent.hasExtras()){
//Saved notification has been clicked to shared preferences
}
希望这可能有所帮助
你可以给intent传递参数,在MainActivity中检查intent是否有参数 Passing arguments to intent android
在 notificationIntent
中添加您想要将 sharedpref 另存为额外的字符串值,如下所示。
notificationIntent.putExtra("Key","Value");
您将能够在 Activity 的 onCreate
中提取它。
String value = getIntent().getStringArrayExtra("Key");
注意:如果你只是想知道activity是否被通知打开,只需在intent中传递任何常量值并检查你是否在onCreate
使用上述方法,这样您就可以确定 activity 是通过通知启动的。只要确保在那种情况下不要使用相同的 key/value 组合作为相同的 activity 意图的额外组合,以便从通知 pendingIntent 流以外的任何其他地方启动它。
正如 Keshav 所解释的,您可以从意图中获取数据并将其存储在 sharedpreferences 中,这里是 SharedPreferenceHelper class。
public class SharedPreferenceHelper {
private static final String STRING_NAME = "your_string_name";
public SharedPreferenceHelper(Context context) {
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
}
public void setString(String your_string){
mPreferences.edit().putString(STRING_NAME,your_string).apply();
}
public String getString(){
return mPreferences.getString(STRING_NAME,null);
}
}
在 MainActivity 中,
public class MainActivity extends AppCompatActivity{
Bundle mBundle;
SharedPreferenceHelper mSharedPreferenceHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSharedPreferenceHelper = new SharedPreferenceHelper(this);
mBundle = getIntent().getExtras();
if(mBundle != null){
mSharedPreferenceHelper.setString(mBundle.getString("your_string_data"));
}
}
如果 activity 已经创建,
@Override
protected void onResume() {
super.onResume();
if(mBundle != null){
mSharedPreferenceHelper.setString(mBundle.getString("your_string_data"));
}
}
enter code here
如果您有任何问题,请告诉我。
重写 MainActivity 中的 onNewIntent 方法
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("KEY", "str value"); //change this according to your need
editor.apply();
}