当前位置: 首页 > 知识库问答 >
问题:

在BroadcastReceiver中使用sharedpreferences时

羿宏硕
2023-03-14
public class PassiveSms extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    SharedPreferences sharedPref= getSharedPreferences("chaosdriver", Context.MODE_PRIVATE);
    int speedLimit = sharedPref.getInt("speedLimit", 1000);
    String message = sharedPref.getString("message", "I'm sorry, but I am driving. I will text you when I am able!");

    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        if (lastKnownLocation.getSpeed() > speedLimit)
        {
            Bundle extras = intent.getExtras();

            if (extras == null)
            {
                return;
            }

            abortBroadcast();

            Object[] pdus = (Object[]) extras.get("pdus");
            SmsMessage msg = SmsMessage.createFromPdu((byte[]) pdus[0]);

            String origNumber = msg.getOriginatingAddress();

            onSend(origNumber);

        }
    }

public void onSend(String px)
{
    String reply = "testest";
    SmsManager smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage(px, null, reply, null, null);
}

}
<?xml version="1.0" encoding="utf-8"?>
<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <receiver
        android:name="biz.midl.drivereply.PassiveLocationChangedReceiver"
        android:enabled="true" />

    <activity
        android:name="biz.midl.drivereply.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="biz.midl.drivereply.Settings"
        android:label="@string/title_activity_settings" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="biz.midl.drivereply.PassiveSms"
        android:label="@string/title_activity_passive_sms" >
    </activity>
    <receiver android:name="biz.midl.drivereply.SMSReceiver" >
        <intent-filter android:priority="999" >
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

    <service android:name=".MyService">
        <intent-filter>
            <action android:name="com.example.MyService"/>
        </intent-filter>
    </service>
</application>

有什么建议吗?

共有1个答案

洪建茗
2023-03-14

您必须使用:

context.getSharedPreferences("chaosdriver", Context.MODE_PRIVATE);

因为SharedPreferences只能从上下文中使用。BroadcastReceiver有适当的上下文变量作为onReceive()方法的第一个参数,所以您可以“毫无疑问地”使用它。

现在它应该工作和解决你的问题。

 类似资料:
  • 问题内容: 使用SharedPreferences,此活动在启动时崩溃。首先,我将发布活动代码,然后将我的LogCat发布。非常感谢你们,你们总是有很大帮助!:-) 活动代码; 这是我的LogCat; 问题答案: 您必须在调用onCreate之后访问共享首选项。否则上下文将为null :)这就是为什么您会得到null指针异常的原因 移动这条线: 在onCreate()中

  • 我在活动中使用notificationcompat.builder,而setAutoCancel(true)工作得很好,但在BroadcastReceiver中就不是这样了--无论用户单击了多少次,通知都一直显示在设备中。在这种情况下,如何禁用用户点击时的通知? Builder.SetContentIntent(pi);

  • 我使用sharedpreferences保存了一些变量,但是我的save方法使应用程序崩溃,出现了空指针异常。 getSharedPreferences()本身不能工作,需要有上下文。在它之前,这可能是一个问题。我已经定义了上下文,导入了SharedPreferences,那么为什么这不起作用呢?

  • 我想在下面的代码中通过SharedPreferences保存我的ToggleButton状态。请引导我。非常感谢。

  • 问题内容: 有没有一种方法可以在共享首选项中设置默认值? 这是我的负载偏好代码 这是我的保存偏好代码 问题答案: 当您使用键和值设置首选项时,实际上是在提供该值。因此,这次不必使用默认值。请参见,在检索该值时,如果以前未设置该值,则可以定义一个默认值。 如果您得到strSavedMem1 =“ default”,那么肯定是默认情况,因为您没有在首选项中为MEM1设置任何其他值

  • 问题内容: 在MainActivity中,我有一个TextView:textV1。我在MainActivity中也有一个更新该textview的方法: 在BroadcasrReceiver中,我需要在MainActivity中更新textV1中的文本。 如何才能做到这一点?BroadcastReceiver从服务运行。我无法更改此代码。我可以从onReceive()访问和更改MainActivit