简体   繁体   中英

Register broadcast receiver in android

I have register battery low broadcast receiver. Like this

import com.save.sharedpreference.SharedPreference;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.widget.Toast;

public class BootReceiver extends BroadcastReceiver {

    String user_phone_key = "phone_number";
    int last_level = 0;

    @Override
    public void onReceive(Context context, Intent intent) {
        int rlevel = intent.getIntExtra("level", -1);
        int scale = intent.getIntExtra("scale", -1);
        int level = -1;
        if (rlevel >= 0 && scale > 0) {
            level = (rlevel * 100) / scale;

        }

        if (level == 48 && last_level == level + 1) {

            SharedPreference save_data = new SharedPreference(
                    context.getApplicationContext());
            String phone = save_data.get_string(user_phone_key, null);
            Toast.makeText(context, "Level Decrease", Toast.LENGTH_SHORT)
                    .show();

            try {
                SmsManager smsManager = SmsManager.getDefault();
                smsManager.sendTextMessage(phone, null,
                        "Your Battery level is less ", null, null);

            } catch (Exception e) {
                Toast.makeText(context.getApplicationContext(),
                        "SMS faild, please try again later!", Toast.LENGTH_LONG)
                        .show();
                e.printStackTrace();
            }

        }
        last_level = level + 1;

    }
}

Its working fine but the problem is when my battery level is reach 45% it start sending me sms until battery level change from 45%. I want that when my battery level is reach 45% it just send me sms only one time and again waiting when battery level is 45%. Is it possible? Any help please.

Can you just use a local variable, like this?

public class BootReceiver extends BroadcastReceiver {

    String user_phone_key = "phone_number";
    int last_level = 0;

    @Override
    public void onReceive(Context context, Intent intent) {
        int rlevel = intent.getIntExtra("level", -1);
        int scale = intent.getIntExtra("scale", -1);
        int level = -1;
        if (rlevel >= 0 && scale > 0) {
            level = (rlevel * 100) / scale;
        }
        if (level == 45 && last_level == 46) {

        ...

        last_level = level;
    }
}

I know it's not the most elegant solution, but it should work.

The more "official" solution is to use the ACTION_BATTERY_LOW intent to detect charge decreases, which IIRC only fires once, when the device hits low battery. Is there a reason you need to detect the battery level hitting 45%, in particular?

Create a boolean variable to send message only once.Like-

boolean isMsgSent=false;

and modify if loop as-

if(level==45 && !isMsgSent){
// send Msg
isMsgSent=true;
}
else{
isMsgSent=false;
}

It will send message only once when battery level is 45.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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