防止广播接收器被最近的应用程序杀死
prevent a Broadcast Receiver from being killed by recent apps
在我的应用程序中,我使用 Broadcast Receiver
检测到达的短信...
当我的应用程序 运行 时,运行良好...
但在被最近的应用程序杀死后,当收到带有 MessageBody:"silent"
的短信时,我的应用程序崩溃了...!
// silent
是我的 SMS BroadcastReceiver 中的一个动作 ...
这是我的代码:
Manifest:
<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
...吗?
感谢您提供的任何帮助
我认为这里的主要问题是,在您的 BroadcastReceiver
中,您正在从您的应用程序 (G.currentActivity
) 调用引用,并且由于该应用程序已死,这使得 BroadcastReceiver
崩溃。问题不在于您的 BroadcastReceiver 不工作...
尝试更改:
Toast.makeText(G.currentActivity, "silent", Toast.LENGTH_SHORT).show();
至
Toast.makeText(context, "silent", Toast.LENGTH_SHORT).show();
正在杀死应用程序,而不是 BroadcastReceiver。当 android 需要时调用接收器。这里的解决方案是使用方法参数提供的上下文而不是可能为空的 activity。
如果您只想在打开应用程序时显示吐司,请考虑添加一个检查以查看 currentActivity 是否为 null(假设它已分配到 onStart 并清除了 onStop),或者在 activity.
在我的应用程序中,我使用 Broadcast Receiver
检测到达的短信...
当我的应用程序 运行 时,运行良好...
但在被最近的应用程序杀死后,当收到带有 MessageBody:"silent"
的短信时,我的应用程序崩溃了...!
// silent
是我的 SMS BroadcastReceiver 中的一个动作 ...
这是我的代码:
Manifest:
<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
...吗?
感谢您提供的任何帮助
我认为这里的主要问题是,在您的 BroadcastReceiver
中,您正在从您的应用程序 (G.currentActivity
) 调用引用,并且由于该应用程序已死,这使得 BroadcastReceiver
崩溃。问题不在于您的 BroadcastReceiver 不工作...
尝试更改:
Toast.makeText(G.currentActivity, "silent", Toast.LENGTH_SHORT).show();
至
Toast.makeText(context, "silent", Toast.LENGTH_SHORT).show();
正在杀死应用程序,而不是 BroadcastReceiver。当 android 需要时调用接收器。这里的解决方案是使用方法参数提供的上下文而不是可能为空的 activity。
如果您只想在打开应用程序时显示吐司,请考虑添加一个检查以查看 currentActivity 是否为 null(假设它已分配到 onStart 并清除了 onStop),或者在 activity.