「.NET for Androidでディスプレイをスリープさせない」の版間の差分
Administrator (トーク | 投稿記録) 細 Administrator がページ「Xamarin.Androidでディスプレイをスリープさせない」を「.NET 8 for Androidでディスプレイをスリープさせない」に移動しました |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| 4行目: | 4行目: | ||
== 解決策:KeepScreenOn == | == 解決策:KeepScreenOn == | ||
アクティビティに「WindowManagerFlags. | アクティビティに「WindowManagerFlags.KeepScreenOn」というフラグを設定すると一時的にディスプレイのスリープを抑制できます。この方法は | ||
* 権限が不要であり | |||
* アクティビティが遷移する際に自動的に解除されます | |||
<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”> | <source lang=“csharp”> | ||
public class Activity1 : AndroidGameActivity | |||
{ | |||
protected override void OnCreate(Bundle bundle) | |||
{ | { | ||
base.OnCreate(bundle); | |||
// ディスプレイをスリープさせない | |||
this.Window.AddFlags(WindowManagerFlags.KeepScreenOn); | |||
} | } | ||
} | |||
</source> | </source> | ||
== 解決策:wakelock == | == 解決策:wakelock == | ||
WakeLockを使う方法は、権限が必要であり、ひとたびディスプレイのスリープを抑制するとアクティビティが遷移しようが何をしようが明示的に解除しない限り延々とスリープが抑制されます。 | |||
当然のように素人にはオススメできない代物です。 | |||
どうしても使いたい場合は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]] | |||
[[category: MonoGame]] | |||
[[category: | |||
[[category:MonoGame]] | |||
2024年10月21日 (月) 08:16時点における版
概要
無操作でもディスプレイをスリープさせたくない場面も多い。 たとえばMonoGameで作る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を使う方法は、権限が必要であり、ひとたびディスプレイのスリープを抑制するとアクティビティが遷移しようが何をしようが明示的に解除しない限り延々とスリープが抑制されます。
当然のように素人にはオススメできない代物です。
どうしても使いたい場合は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;
}
}