Android后台启动PayPalService触发IllegalStateException问题求助
问题描述
错误日志
Process: com.firstmile.taxicabondemandtaxi, PID: 9900 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.firstmile.taxicabondemandtaxi/com.firstmile.taxicabondemandtaxi.activity.MainActivity}: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.firstmile.taxicabondemandtaxi/com.paypal.android.sdk.payments.PayPalService (has extras) }: app is in background uid UidRecord{5e38638 u0a301 TPSL idle procs:1 seq(0,0,0)} at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3307) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3446) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2043) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:221) at android.app.ActivityThread.main(ActivityThread.java:7542) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.firstmile.taxicabondemandtaxi/com.paypal.android.sdk.payments.PayPalService (has extras) }: app is in background uid UidRecord{5e38638 u0a301 TPSL idle procs:1 seq(0,0,0)} at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1626) at android.app.ContextImpl.startService(ContextImpl.java:1581) at android.content.ContextWrapper.startService(ContextWrapper.java:679) at com.firstmile.taxicabondemandtaxi.activity.MainActivity.onCreate(MainActivity.java:380) at android.app.Activity.performCreate(Activity.java:7893) at android.app.Activity.performCreate(Activity.java:7880) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3282) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3446) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2043) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:221) at android.app.ActivityThread.main(ActivityThread.java:7542) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 2022-11-30 10:06:23.297 9900-9979/com.firstmile.taxicabondemandtaxi D/NetworkSecurityConfig: No Network Security Config specified, using platform default 2022-11-30 10:06:23.350 9900-9900/com.firstmile.taxicabondemandtaxi I/Process: Sending signal. PID: 9900 SIG: 9
当前启动服务代码
Intent intent = new Intent(context, PayPalService.class); intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config); getApplication().startService(intent); public static final String EXTRA_PAYPAL_CONFIGURATION = "com.paypal.android.sdk.paypalConfiguration";
解决方案
1. 适配Android后台服务限制(API 26+)
Android 8.0(API 26)及以上系统禁止APP在后台启动普通服务,需改用startForegroundService替代startService,同时要确保服务启动后5秒内调用startForeground显示前台通知:
修改启动代码:
Intent intent = new Intent(context, PayPalService.class); intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config); // 根据系统版本选择启动方式 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { getApplication().startForegroundService(intent); } else { getApplication().startService(intent); }
同时在AndroidManifest.xml中添加前台服务权限及配置:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- Android 12+ 需指定服务类型,根据PayPal服务用途选择,例如数据同步 --> <service android:name="com.paypal.android.sdk.payments.PayPalService" android:foregroundServiceType="dataSync" />
2. 调整服务启动时机
避免在APP后台状态下启动服务,比如将PayPalService的启动时机从MainActivity.onCreate()移到用户触发的交互事件中(如点击支付按钮),此时APP处于前台,不会触发后台启动限制。
3. 升级PayPal SDK版本
检查当前使用的PayPal Android SDK版本,升级到官方最新版本,新版本通常已适配Android系统的后台服务限制,无需额外修改代码即可解决问题。
内容的提问来源于stack exchange,提问作者Swaraj Darne
相关产品推荐
相关产品推荐

