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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防止广播接收器被最近的应用程序杀死相关的知识,希望对你有一定的参考价值。

在我的应用程序中,我使用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>

广播接收器:

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需要时调用接收器。这里的解决方案是使用方法参数提供的上下文而不是可能为null的活动。

如果您只想在打开应用程序时显示toast,请考虑添加一个检查以查看currentActivity是否为null(假设它已分配onStart并在onStop上清除),或者在活动中注册接收器。

另一答案

我认为这里的主要问题是,在你的BroadcastReceiver中,你正在从你的应用程序(G.currentActivity)中调用一个引用,并且由于应用程序已经死了,这使得BroadcastReceivercrash。问题不在于您的BroadcastReceiver无法正常工作......

以上是关于防止广播接收器被最近的应用程序杀死的主要内容,如果未能解决你的问题,请参考以下文章

如何防止android应用中的service被系统回收

从广播接收器更改片段

Android防止Service被杀死

Android防止Service被杀死

Android防止Service被杀死

如何防止应用重启后自动创建子片段?