简体   繁体   English

切换按钮以打开通知

[英]Switch button to turn on notifications

hope you could help me here! 希望你能在这里帮助我! I want to make a switch button that turns on a function of push daily push notification. 我想制作一个开关按钮,以打开每日推送通知功能。 how do I do that? 我怎么做?

the switch button is on the Settings fragment 开关按钮位于“设置”片段上

My MainActivity.java: 我的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 = "<font color=#6774bd>About SG50 App</font>";

    AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle);
    builder.setTitle(Html.fromHtml(text2));

    String text3 = "<font color=#A4A4A4>App made by Matan Cohen , Please contact me for any questions.</font>";//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();
 }

}

fragment Settings.java the "editor.getBoolean" gives me cannot resolve error!! 片段Settings.java 的“ editor.getBoolean”给我无法解决错误! what can I do? 我能做什么? :

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 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: fragemnt_settings.XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="30dp"
android:paddingBottom="30dp"
android:paddingTop="30dp"
android:paddingRight="30dp">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:weightSum="1">

    <Switch
        android:id="@+id/switch1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:layout_gravity="left" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="right"
        android:text="@string/daily_tip"
        android:textSize="20sp"/>
</LinearLayout>


</LinearLayout>

Thank you!! 谢谢!! Hope you can help me! 希望你能帮我!

THE editor.getBoolean GIVES ME CANNOT RESOLVE ERROR!!! editor.getBoolean给我无法解决错误!!! what Can I do??? 我能做什么???

You will need to save the value of the switch somewhere(SQLite or SharedPreferences) and check if it is the current switch value, than change the value in the place you keep it on switch checked or unchecked 您将需要将开关的值保存在某处(SQLite或SharedPreferences),并检查它是否为当前开关值,然后将其值保持在选中或未选中的位置

this is how you create SharedPreferences and put in a value: 这是创建SharedPreferences并放入值的方法:

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

this is how you check the SharedPreferences value and change it: 这是您检查SharedPreferences值并进行更改的方法:

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

where you want to notify a notification you should check the SharedPreferences value: 您要在其中通知通知的位置,应检查SharedPreferences值:

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

edited This is how you fire a notifications: 已编辑这是您触发通知的方式:

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 you can give to every notification. notification_id-您可以为每个通知提供的int ID。 you can set delete intent and content intent(if the user clicks on the notification) 您可以设置删除意图和内容意图(如果用户单击通知)

Man you need to use the same "key". 男人,您需要使用相同的“键”。 like that: 像那样:

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

If understand correctly, the issue here is not about how to know if the switch is turned on or off, but about avoiding getting push notifications according to switch state. 如果理解正确,那么这里的问题不是关于如何知道开关是打开还是关闭,而是关于避免根据开关状态获得推送通知。

You want to avoid getting the notification and NOT - get the notification and decide whether to present it or not. 您希望避免收到通知,而不要-收到通知并决定是否显示通知。

So what you need is to save switch state as mentioned in other answers, but in addition - If the user switched the state to OFF you need to unregister the user from getting the notifications and vice versa, using the following: 因此,您需要的是保存其他答案中提到的开关状态,但是此外-如果用户将状态切换为OFF,则需要使用以下方法取消注册用户的通知,反之亦然:

Either delete the token from the server which holds the user's FCM token: 从服务器上删除持有用户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

Or if this user is registered to a specific notification topic 或者,如果此用户已注册到特定的通知主题

// Unregister him from the topic
FirebaseMessaging.getInstance().unsubscribeToTopic("news");

// Register him back in case switch is on
FirebaseMessaging.getInstance().subscribeToTopic("news");
boolean showNotifications = editor.getBoolean("key",false);

boolean showNotifications = sharedPreferences.getBoolean("key",false);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM