在Xamarin中设置Window KeepScreenOn标志

时间:2017-08-01 03:41:13

标签: c# android xamarin xamarin.android xamarin.forms

我正在使用Xamarin Forms来显示来自

的HybridWebView控件

https://github.com/XLabs/Xamarin-Forms-Labs/blob/master/src/Forms/XLabs.Forms.Droid/Controls/HybridWebView/HybridWebViewRenderer.cs

问题是我想设置KeepScreenOn标志,但是无法从静态上下文调用Window.AddFlags方法,但据我所知,没有活动可以随时访问

Window.AddFlags(WindowManagerFlags.KeepScreenOn);

在共享项目中,我有App.xaml.cs,它调用:

MainPage = new Project_App.MainPage();

然后在MainPage.xaml.cs

public MainPage()
{
    InitializeComponent();
    var hybridWebView = new HybridWebView {};
    Content = hybridWebView;
}

最后在.Droid项目中,我有HybridWebViewRenderer.cs

public class HybridWebViewRenderer : ViewRenderer<HybridWebView, Android.Webkit.WebView> {

    Android.Webkit.WebView webView = null;


    protected override void OnElementChanged(ElementChangedEventArgs<HybridWebView> e) {
            webView = new Android.Webkit.WebView(Forms.Context);    
   }

我在.Droid项目中也有一个MainActivity.cs

[Activity(Label = "Project_App", MainLauncher = true]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity {
    protected override void OnCreate(Bundle bundle) {
        base.OnCreate(bundle);
        global::Xamarin.Forms.Forms.Init(this, bundle);
        Window.AddFlags(WindowManagerFlags.KeepScreenOn);
        LoadApplication(new Project_App.App());         
    }
}

但是,将Window.AddFlags放在此文件中不会使屏幕保持活动状态,并且在此行上放置断点永远不会被命中,但是删除整个文件会导致应用无法启动

为什么最后一个文件中的断点永远不会被命中,或者我怎样才能获得对该活动的引用,以便我可以从HybridWebViewRenderer.cs类中的方法调用AddFlags?

1 个答案:

答案 0 :(得分:1)

  

但是,将Window.AddFlags放在此文件中不会使屏幕保持活动状态,并且在此行上放置断点永远不会被命中

KeepScreenOn标记需要权限WAKE_LOCK,要使此代码正常工作,我们需要在清单中添加此权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />

在真实设备上测试,运行正常。对于断点不会被解雇的问题,可能是你的Xamarin版本的问题,尝试更新你的Xamarin。

  

如何获取对活动的引用,以便我可以从HybridWebViewRenderer.cs类中的方法调用AddFlags?

我猜您没有发布HybridWebViewRenderer的所有代码,这里针对您的问题,您可以在渲染器中创建方法,例如:

public void Keepscreenon()
{
    var mainactivity = Forms.Context as MainActivity;
    mainactivity.Window.AddFlags(WindowManagerFlags.KeepScreenOn);
}