防止广播接收器被最近的应用程序杀死



在我的应用程序中,我使用Broadcast Receiver来检测到达的短信…
当我的应用程序运行时,工作良好…
但是被最近的应用程序杀死后,当MessageBody:"silent"的短信到达时,我的应用程序崩溃了…!
//silent是一个动作在我的SMS BroadcastReceiver…

下面是我的代码:

清单:

<receiver android:name=".SmsReceiver" >
            <intent-filter android:priority="999">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

BroadcastReceiver:

public class SmsReceiver extends BroadcastReceiver {
public static String senderTel;
public static String messageBody;


    @Override
    public void onReceive(Context context, Intent intent) {
        Object[] pdus = (Object[]) intent.getExtras().get("pdus");
        SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdus[0]);
        senderTel = sms.getOriginatingAddress();
        messageBody = sms.getMessageBody().toLowerCase().trim();


        if(messageBody.equals("silent")){
            G.AudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
            G.AudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
            Toast.makeText(G.currentActivity, "silent", Toast.LENGTH_SHORT).show();
        }
    }
G:

public class G extends Application {
    public static Context           context;
    public static Activity currentActivity;
 @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        AudioManager= (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE);
    }
}

LogCat:

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference

所以我尝试使用服务和警报管理器,但他们失败了

Intent intent = new Intent(G.context, SmsReceiver.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(G.context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        G.alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 3000, pendingIntent);

我想保持我的广播接收器活着,即使在应用程序被最近的应用程序杀死或强制关闭…
有必要使用Service…吗?


感谢您提供的任何帮助

尝试更改:

Toast.makeText(G.currentActivity, "silent", Toast.LENGTH_SHORT).show();

Toast.makeText(context, "silent", Toast.LENGTH_SHORT).show();

应用程序被终止,而不是BroadcastReceiver。当android需要接收器时调用它。这里的解决方案是使用方法参数提供的上下文,而不是可能为空的活动。

如果你想只在应用程序打开时显示toast,考虑添加一个检查来查看currentActivity是否为null(假设它被分配到onStart并在onStop被清理),或者在activity中注册接收者

我认为这里的主要问题是,在您的BroadcastReceiver中,您正在调用来自应用程序(G.currentActivity)的引用,并且由于应用程序已死,这使得BroadcastReceiver崩溃。问题不在于你的BroadcastReceiver不工作

最新更新