切换按钮以打开通知

希望你能在这里帮助我! 我想制作一个开关按钮,打开推送每日推送通知的function。 我怎么做?

切换按钮位于“设置”片段上

我的MainActivity.java:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); displayView(R.id.nav_home); } @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); return; } if (getSupportFragmentManager().findFragmentById(R.id.content_main) instanceof Article) { ((Article) getSupportFragmentManager().findFragmentById(R.id.content_main)).handleOnBackPress(); return; } if (getSupportFragmentManager().getBackStackEntryCount() == 0) { displayView(R.id.nav_home); } else { super.onBackPressed(); } } private void displayView(int itemId) { Fragment fragment = null; switch (itemId) { case R.id.nav_home: fragment = new Article(); break; case R.id.nav_Recipes: fragment = new RecipesMain(); break; case R.id.nav_Converter: fragment = new Converter(); break; case R.id.nav_Videos: fragment = new Videos(); break; case R.id.nav_Tracking: fragment = new Tracking(); break; case R.id.nav_TrainerMenu: fragment = new TrainerMenu(); break; case R.id.nav_Settings: fragment = new Settings(); break; case R.id.nav_About: showDialog(); break; } if (fragment != null) { final Fragment finalFragment = fragment; new Handler().postDelayed(new Runnable() { @Override public void run() { getSupportFragmentManager() .beginTransaction() .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right) .replace(R.id.content_main, finalFragment) .commit(); } }, 0); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); } @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { displayView(item.getItemId()); return true; } private void showDialog() { String text2 = "About SG50 App"; AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle); builder.setTitle(Html.fromHtml(text2)); String text3 = "App made by Matan Cohen , Please contact me for any questions.";//for custom message builder.setMessage(Html.fromHtml(text3)); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast toast = Toast.makeText(getApplicationContext(), "תודה על שימוש", Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } }); builder.show(); } } 

片段Settings.java “editor.getBoolean”给我无法解决错误!! 我能做什么?

 public class Settings extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_settings, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); getActivity().setTitle("הגדרות"); Switch aSwitch = (Switch) getView().findViewById(R.id.dailyTipSwitch); SharedPreferences sharedPreferences = getActivity().getSharedPreferences("key", 0); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("switchValue", aSwitch.isChecked()); editor.apply(); boolean showNotifications = editor.getBoolean("key",false); if (aSwitch.isChecked() != showNotifications) { editor.putBoolean("key",!showNotifications).apply(); } else { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY,19); calendar.set(Calendar.MINUTE,27); Intent intent = new Intent(getActivity().getApplicationContext(),NotificationReciever.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity().getApplicationContext(),100,intent,PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(ALARM_SERVICE); alarmManager.setRepeating(alarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY,pendingIntent); } } } 

Notification_Reciever.java

 public class NotificationReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); Intent repeatingIntent = new Intent(context,MainActivity.class); repeatingIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(context,100,repeatingIntent,PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.mipmap.ic_launcher) .setStyle(new NotificationCompat.BigTextStyle().bigText("בוקר טוב אלוף! תאכל ותשתה טוב!")) .setContentText(context.getString(R.string.NotificationText)) .setContentTitle(context.getString(R.string.GoodMorningNotification)) .setContentIntent(pendingIntent) .setAutoCancel(true); notificationManager.notify(100, mBuilder.build()); } } 

fragemnt_settings.XML:

       

谢谢!! 希望你能帮我!

editor.getBoolean让我无法解决错误! 我能做什么???

您需要在某处保存交换机的值(SQLite或SharedPreferences)并检查它是否是当前的交换机值,而不是更改保持交换机选中或取消选中的位置的值

这是您创建SharedPreferences并输入值的方法:

  SharedPreferences sharedPreferences = getSharedPreferences("key", 0); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("switchValue", aSwitch.isChecked()); editor.apply(); 

这是检查SharedPreferences值并更改它的方法:

  Boolean showNotifications = editor.getBoolean("key",false); if (aSwitch.isChecked() != showNotifications) { editor.putBoolean("key",!showNotifications).apply(); } 

如果要通知通知,则应检查SharedPreferences值:

 Boolean showNotifications = editor.getBoolean("key",false); 

编辑这是您发送通知的方式:

 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.your_drawable) .setStyle(new NotificationCompat.BigTextStyle().bigText("notification text")) .setContentText(notificationToNotify.getText()) .setContentTitle(CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, "notification title")) .setContentIntent(contentPendingIntent) .setDeleteIntent(deletePendingIntent) .setAutoCancel(true); //notify the Notification mNotifyMgr.notify(notification_id, mBuilder.build()); 

notification_id – 您可以为每个通知提供的int id。 您可以设置删除意图和内容意图(如果用户点击通知)

男人你需要使用相同的“钥匙”。 像那样:

 SharedPreferences sharedPreferences = getActivity().getSharedPreferences("key", 0); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("**switchValue**", aSwitch.isChecked()); editor.apply(); boolean showNotifications = editor.getBoolean("**switchValue**",false); 

如果理解正确,这里的问题不是关于如何知道交换机是打开还是关闭,而是关于避免根据交换机状态获取推送通知。

您希望避免收到通知而不是 – 获取通知并决定是否提供通知。

所以你需要的是保存其他答案中提到的开关状态,但另外 – 如果用户将状态切换为OFF,则需要取消注册用户以获取通知,反之亦然,使用以下内容:

从服务器中删除包含用户FCM令牌的令牌:

 // Remove user from notification messages InstanceID.getInstance(context).deleteInstanceID(); // Register user back to get notifications FirebaseInstanceId.getInstance().getToken() // This will call the onTokenRefresh() method which will call your implementation that calls your FCM server and update the new user's token 

或者,如果此用户已注册到特定通知主题

 // Unregister him from the topic FirebaseMessaging.getInstance().unsubscribeToTopic("news"); // Register him back in case switch is on FirebaseMessaging.getInstance().subscribeToTopic("news");