「.NET for Androidでディスプレイをスリープさせない」の版間の差分

提供:MonoBook
編集の要約なし
 
(同じ利用者による、間の4版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
無操作でもディスプレイをスリープさせたくない場面も多い。
無操作でもディスプレイをスリープさせたくない場面も多い。
たとえば[[MonoGame]]で作る[[Android]]向けの[[ゲーム]]などである。
たとえば[[MonoGame]]で作る[[Android]]向けの[[ゲーム]]などである。
== 環境 ==
* Xamarin.Android
* .NET for Android
Xamarin.Androidの頃から変わっていない。


== 解決策:KeepScreenOn ==
== 解決策:KeepScreenOn ==
アクティビティに「WindowManagerFlags.KeepScreenOn」というフラグを設定すると一時的にディスプレイのスリープを抑制できる。この方法は権限が不要であり、アクティビティが遷移する際に自動的に解除される。[[MonoGame]]でもこの方法は有効である。
アクティビティに「WindowManagerFlags.KeepScreenOn」というフラグを設定すると一時的にディスプレイのスリープを抑制できます。この方法は
<source lang=“csharp”>
* 権限が不要であり
    public class Activity1 : AndroidGameActivity
* アクティビティが遷移する際に自動的に解除されます
 
<source lang=csharp>
public class MainActivity : Activity
{
    protected override void OnCreate(Bundle? savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
 
        // 画面をオフにしない。
        this.Window!.AddFlags(Android.Views.WindowManagerFlags.KeepScreenOn);
    }
}
</source>
 
[[MonoGame]]でもこの方法は有効です。
<source lang=csharp>
public class Activity1 : AndroidGameActivity
{
    protected override void OnCreate(Bundle bundle)
     {
     {
         protected override void OnCreate(Bundle bundle)
         base.OnCreate(bundle);
        {
            base.OnCreate(bundle);


            // ディスプレイをスリープさせない
        // ディスプレイをスリープさせない
            this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);  
        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);  
        }
     }
     }
}
</source>
</source>


== 解決策:wakelock ==
== 解決策:wakelock ==
この方法は権限が必要であり、ひとたびディスプレイのスリープを抑制するとアクティビティが遷移しようが何をしようが明示的に解除しない限り延々と抑制される。あまりオススメできない。
WakeLockを使う方法は、権限が必要であり、ひとたびディスプレイのスリープを抑制するとアクティビティが遷移しようが何をしようが明示的に解除しない限り延々とスリープが抑制されます。
よって省略する。
 
当然のように素人にはオススメできない代物です。
 
; 必要な権限
* <uses-permission android:name="android.permission.WAKE_LOCK" />
 
; 大雑把なソース
どうしても使いたい場合はWakeLock利用中のあらゆる暴走をtry/catchして確実にReleaseしてください。
[[メモリ不足]]などの「アプリ外の影響」「[[OS]]の暴走」も想定しましょう。
<source lang=csharp>
 
PowerManager? _powerManager;
PowerManager.WakeLock? _wakelock;
 
void Initialize()
{
    _powerManager = GetSystemService(Context.PowerService) as PowerManager;
    _wakelock = _powerManager?.NewWakeLock(WakeLockFlags.Full, "tag")!;
}
 
void Start()
{
    if (_wakelock != null)
    {
        _wakelock.Acquire();
    }
}
 
void Stop()
{
    if (_wakelock != null && _wakelock.IsHeld)
    {
        _wakelock.Release();
    }
}
 
void Release()
{
    if (_wakelock != null)
    {
        if (_wakelock.IsHeld)
        {
            _wakelock.Release();
        }
        _wakelock.Dispose();
        _wakelock = null;
    }
}
</source>


== 関連項目 ==
== 関連項目 ==
* [[Xamarin.Androidで画面の向きを固定する]]
* [[Xamarin.Androidで画面の向きを固定する]]


== 参考文献 ==
[[category: .NET for Android]]
{{reflist}}
[[category: MonoGame]]
 
{{stub}}
 
[[category:Xamarin.Android]]
[[category:MonoGame]]

2024年10月21日 (月) 10:07時点における最新版

概要[編集 | ソースを編集]

無操作でもディスプレイをスリープさせたくない場面も多い。 たとえばMonoGameで作るAndroid向けのゲームなどである。

環境[編集 | ソースを編集]

  • Xamarin.Android
  • .NET for Android

Xamarin.Androidの頃から変わっていない。

解決策:KeepScreenOn[編集 | ソースを編集]

アクティビティに「WindowManagerFlags.KeepScreenOn」というフラグを設定すると一時的にディスプレイのスリープを抑制できます。この方法は

  • 権限が不要であり
  • アクティビティが遷移する際に自動的に解除されます
public class MainActivity : Activity
{
    protected override void OnCreate(Bundle? savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // 画面をオフにしない。
        this.Window!.AddFlags(Android.Views.WindowManagerFlags.KeepScreenOn);
    }
}

MonoGameでもこの方法は有効です。

public class Activity1 : AndroidGameActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // ディスプレイをスリープさせない
        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn); 
    }
}

解決策:wakelock[編集 | ソースを編集]

WakeLockを使う方法は、権限が必要であり、ひとたびディスプレイのスリープを抑制するとアクティビティが遷移しようが何をしようが明示的に解除しない限り延々とスリープが抑制されます。

当然のように素人にはオススメできない代物です。

必要な権限
  • <uses-permission android:name="android.permission.WAKE_LOCK" />
大雑把なソース

どうしても使いたい場合はWakeLock利用中のあらゆる暴走をtry/catchして確実にReleaseしてください。 メモリ不足などの「アプリ外の影響」「OSの暴走」も想定しましょう。

PowerManager? _powerManager;
PowerManager.WakeLock? _wakelock;

void Initialize() 
{
    _powerManager = GetSystemService(Context.PowerService) as PowerManager;
    _wakelock = _powerManager?.NewWakeLock(WakeLockFlags.Full, "tag")!;
}

void Start() 
{
    if (_wakelock != null) 
    {
        _wakelock.Acquire();
    }
}

void Stop() 
{
    if (_wakelock != null && _wakelock.IsHeld)
    {
        _wakelock.Release();
    }
}

void Release() 
{
    if (_wakelock != null)
    {
        if (_wakelock.IsHeld)
        {
            _wakelock.Release();
        }
        _wakelock.Dispose();
        _wakelock = null;
    }
}

関連項目[編集 | ソースを編集]