【问题标题】:UI From Service来自服务的 UI
【发布时间】:2018-04-16 19:04:55
【问题描述】:

我正在尝试从服务启动 Activity,但无法打开屏幕。
后台服务每 5 分钟运行一次。
来电:
服务

 private boolean criticalAlarm(int inBg, int inAlarmType) {
        Intent openAlarmActivity = new Intent(this, MySwipeAlarm.class);
        openAlarmActivity.setAction(Intent.ACTION_VIEW);
        openAlarmActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        openAlarmActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

        openAlarmActivity.putExtra("bgValue", String.valueOf(inBg));
        openAlarmActivity.putExtra("alarmType", String.valueOf(inAlarmType));
        if(glbDebug) Log.d("DexService", "Starting Critical alarm activity");
        startActivity(openAlarmActivity);
        return true;
    }

这是活动的开始。

public class MySwipeAlarm extends Activity implements OnSeekBarChangeListener {

    //declare variables
    private MediaPlayer mediaPlayer;
    final DexDB myDb    = new DexDB(this);
    ...

一些注释确实下面的“调试”语句被调用。如果我调用某个媒体播放器,它会被调用,因此这不是电源管理器情况(在服务中处理),也不是清单问题。我已经为此苦苦挣扎了一段时间,我就是无法打开屏幕

注意 2:通过 getWindow 打开屏幕的尝试在下面的方法中或在 onCreate() 期间指定时不起作用..

  @Override
    public void onAttachedToWindow(){

        if(debug) Log.d("Alarm", "HERE ????");
        Window window = getWindow();

        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN |                       // Let's wake up the screen
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                        WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
                View.SYSTEM_UI_FLAG_HIDE_NAVIGATION  |                                  // hide nav bar
                View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |                                  // hide nav bar
                View.SYSTEM_UI_FLAG_FULLSCREEN |                                        // hide status bar
                View.SYSTEM_UI_FLAG_IMMERSIVE);

    }

清单的一部分

  <uses-feature android:name="android.hardware.usb.host" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>

还有一些输出只是为了证明“东西”被调用了

04-16 14:43:09.121 1131-1131/com.dextender.dextender D/Alarm: Past starting the screen
04-16 14:43:09.131 1131-1131/com.dextender.dextender D/Typeface: fontPath: 
04-16 14:43:09.131 1131-1131/com.dextender.dextender D/SQLiteConnection: enable sqlite enhance.
04-16 14:43:09.151 1131-1131/com.dextender.dextender D/Alarm: HERE ????
04-16 14:43:09.161 1131-1231/com.dextender.dextender E/OpenGLRenderer: void android::uirenderer::renderthread::CanvasContext::setSurface(android::Surface *) to create EGLSurface com.dextender.dextender/com.dextender.dextender.MySwipeAlarm
04-16 14:43:09.171 1131-1131/com.dextender.dextender D/Typeface: fontPath: 
04-16 14

【问题讨论】:

    标签: java android android-activity service


    【解决方案1】:

    我发现了这个问题,我正在分享,因为我的搜索很少出现在这个主题上。

    注意:现在是 2018 年,所以我找到的一些信息是旧的。

    我的服务产生一个活动,唤醒锁在服务中处理。关于做完全唤醒锁的旧帖子不再适用,因为它已被弃用,因此必须通过 WindowManager 完成屏幕开/关操作。

    因此,服务获得部分唤醒锁,触发 Intent,此时一切都在 Activity 手中。

    问题 1 - 是在“OnPause”中调用破坏,因为如果有人按下主页按钮,我想终止警报。问题是屏幕从未打开,然后调用 OnPause,活动被终止。

    问题 2 - 问题的真正症结在于 getWindow() 调用中 addflags 和 setFlags 之间的区别。我有 setFlags,但没有指定“FLAG_TURN_SCREEN_ON”(呃!)。如果您查看我的原始帖子,我将它作为 setFlags 的掩码。我将调用改为:

      window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN |                       // Let's wake up the screen
                            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
                            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    

    这解决了问题。

    我确实将上面的调用移到了 onAttachedToWindow() 方法而不是 onCreate(),并在“onPause()”方法上放回了销毁的调用。

    这是在手机关闭和锁定屏幕开启的情况下进行的测试,以及在手机开启的情况下进行的测试,但在我的应用程序接管之前前台有一个不同的应用程序。

    经验教训。复制/粘贴示例时,了解它们的工作原理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多