【问题标题】:Unable to launch Activity From Service with Intent :Version android 12无法使用 Intent 从服务启动 Activity:版本 android 12
【发布时间】:2022-09-23 12:54:21
【问题描述】:

我正在创建一个应用程序,我想在其中检查活动的状态,例如活动是在前台还是在后台。这在代码中工作得很好,但是我想在后台使用服务时将活动带到前台,所以当活动将进入后台状态,我正在调用该服务,并从该服务启动活动,但在相同的意图代码不起作用后,服务在版本 10 之前工作正常。 这是我的代码。 MainActivity.Java

 @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            if(android.os.Build.VERSION.SDK_INT>=29 && 
    !Settings.canDrawOverlays(getApplicationContext())) {
                MainActivity.this.startActivity(new 
    Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION));
            }

        }

这是扩展应用程序的 DigitalApp 类,我从中调用服务。

        public class DigitalApp extends Application implements Application.ActivityLifecycleCallbacks 
    {

        private int activityReferences = 0;
        private boolean isActivityChangingConfigurations = false;

        @Override
        public void onCreate() {
            super.onCreate();

            registerActivityLifecycleCallbacks(this);

        }

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

        }

        @Override
        public void onActivityStarted(Activity activity) {
            if (++activityReferences == 1 && !isActivityChangingConfigurations) {
                // App enters foreground

                Toast.makeText(this,\"App is in foreground with 
    activity::\"+activity.getLocalClassName(),Toast.LENGTH_LONG).show();
                Log.d(\"Tracking Activity Started\", activity.getLocalClassName());

                Log.d(\"TAG\",\"App is in foreground\");
            }

        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {

        }

        @Override
        public void onActivityStopped(Activity activity) {

           Toast.makeText(this,\"App enters background with 
    activity::\"+activity.getLocalClassName(),Toast.LENGTH_LONG).show();

            isActivityChangingConfigurations = activity.isChangingConfigurations();
            if (--activityReferences == 0 && !isActivityChangingConfigurations) {
                // App enters background

                Log.d(\"Tracking Activity Stopped\", activity.getLocalClassName());
                Log.d(\"TAG\",\"App enters background\");
                Intent i= null;



                   getApplicationContext().startService(new 
    Intent(getApplicationContext(),service.class));



            }
        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

        }

        @Override
        public void onActivityDestroyed(Activity activity) {

        }
    }

这是服务类。

         @Override
        public void onCreate() {
            super.onCreate();


            Handler handler = new Handler();

            handler.postDelayed(new Runnable() {
                public void run() {

                    Toast.makeText(getApplicationContext(), \"IN HANDLER OF SERVICE\", 
    Toast.LENGTH_LONG).show();


                    Intent i = new Intent(getApplicationContext(), MainActivity.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    getApplicationContext().startActivity(i);




            }, 3000);


        }

我在处理程序中传递意图以在进入后台状态时启动活动。处理程序处于服务的 oncreate 方法中。我希望在进入后台状态后再次从那里启动活动。

我正在使用标记新任务,但是没有启动此标记活动,我会添加其他标记吗?

  • 只是为了澄清一下,您是否尝试在延迟后被用户关闭时启动应用程序?
  • 是 3 秒后我想再次打开该应用程序
  • 你知道你的Service 是不是一个真正的入门?您可能想要添加一些调试日志记录,以便查看发生了什么。
  • 是的,服务已启动,我收到了我在启动和创建方法时在服务中打印的 toast 消息。而且 ACTIVITY 正在 android 10 版本中重新启动,因此服务正在启动。

标签: android android-activity activity-lifecycle


【解决方案1】:

从您的活动的onStop() 开始这样的服务-

fun launchService(){
    val serviceIntent = Intent(this, LaunchAppService::class.java)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForegroundService(serviceIntent)
    }else{
        startService(serviceIntent)
    }
}

并显示前台服务通知like this

【讨论】:

    【解决方案2】:

    如果您想从后台开始活动,您需要获得<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 的许可

    它是运行时权限,因此用户需要允许它。

    试试这个它对我有用!

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多