MyApp的接收器只是工作正常,如果它在后台,这是:
public class MySmsReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("triggered sms");
if(intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
Toast.makeText(context, "message Received", Toast.LENGHT_SHORT).show();
}
}
我的收件人清单文件是
<receiver android:name=".MySmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
文档说,如果我在清单文件中声明一个接收器,它应该总是有效的。但在我的情况下,它不是…
我发现一些应用程序,如watsapp和fb总是保存在内存中,我说这个bcoz在滑动清除最近的应用程序之后仍然任务管理器具有如下所示的followig状态
我怎么能这样做到我的应用程序…什么将使我的应用程序表现得像其他第三方应用程序,如watspp和facebook….我怎么能让我的应用程序在内存中总是我问这个然后只有我的接收器将永远工作…如果我错了,然后给我一个解决方案来做到这一点…
我一直在寻找这个很多,但我仍然找不到解决方案…我问错了吗?或者真的有办法做到吗?请有人帮帮我…这让我一个星期!!!希望我在这里解释了我的问题,如果我不问我,我会立即给你回应。
在一些华为设备(以及一些LG和小米设备)上,你需要将你的应用添加到允许在后台运行的应用列表中。如果你不这样做,一旦你的应用停止(通过从最近的任务列表中滑动,或者Android因资源原因杀死应用),它将不会自动重启。
在华为设备上,该设置称为“受保护应用”。你不能以编程方式将你的应用添加到“受保护应用”列表中。你需要告诉用户,他必须在你安装了你的应用后执行此操作。知名应用(如Whatsapp、Facebook、Google Mail)由制造商自动添加。
这种行为在不同的设备上可能不同,在不同版本的Android系统上可能不同,如果设备是为特定的移动运营商“品牌”的,这种行为可能会不同,因为移动运营商自己也可以修改设置。
有关更多详细信息,请参阅华为手机上的“受保护应用”设置以及如何处理它。
编辑:添加了这个:
此外,Android在Android 4.4(Kitkat)中破坏了“从最近滑动”的行为,因此它会导致已滑动的应用程序出现问题。粘性服务不会被重新启动,广播Intent
也不会交付。这里有一些关于解决方法的信息:在android 4.4中,将应用程序从最近的任务中滑动出来会永久杀死应用程序及其服务。知道为什么吗?
此外,您是否从Google Play商店安装了您的应用程序?从Play商店安装的应用程序与本地安装的应用程序(从下载或通过adb
或其他方式)的行为可能不同。
看起来这种情况发生在少数设备(例如:小米、荣耀设备、具有SmartManager功能的三星设备等)中,当用户从最近的任务中删除应用程序时,应用程序会强制停止。
这是因为这些制造商默认添加了任务管理器功能,强制停止应用程序进行内存/电池管理。但是像Whatsapp、Facebook这样的应用程序很少工作。这可能是因为他们会将最著名的应用程序列入白名单。
遵循Android开发者留档/用户体验建议,这是这种情况的一个可能的解决方法,
案例小米基于MIUI设备:
创建一个用户体验来与用户交流,以对您的应用程序启用“自动启动”权限。基本上,用户必须打开“安全”应用程序-
检查厂商是否为小米后进行上述操作
String manufacturer = "xiaomi";
if(manufacturer.equalsIgnoreCase(android.os.Build.MANUFACTURER)) {
//this will open auto start screen where user can enable permission for your app
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
startActivity(intent);
}
注意:此过程对于荣耀设备和三星设备可能有所不同,因为它对制造商非常具体。
同样作为解决其他设备此问题的正常方法,是使用覆盖onTaskRemove
方法创建粘性服务。使用以下代码:
public class BackgroundService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onTaskRemoved(Intent rootIntent) {
//create a intent that you want to start again..
Intent intent = new Intent(getApplicationContext(), BackgroundService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 1, intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent);
super.onTaskRemoved(rootIntent);
}
}
在这里,服务将在5秒后重新启动。您可以将其替换为从最近的应用程序中清除后想要重新启动的任何意图。
如果禁用“强制停止”按钮,则意味着在概览中滑动应用程序会导致您的应用程序在此设备上强制停止。在用户再次与您的应用程序交互之前,您将不会收到任何广播。