Wahrscheinlich habe ich ein ähnliches Verhalten wie bei Ihrem Ziel erreicht, aber meine Antwort muss überprüft werden. Wie auch immer, hier ist es meine Lösung.
Ich habe zwei Komponenten:
ein Verfahren das Statusfeld eine brandneue Aktivität vor
einen Zuhörer zum Einsturz zu allen Aktivitäten zu feuern
Der erster Teil ist ziemlich einfach: Sie nur diese Methode in Ihrer Tätigkeit:
private void collapseStatusBar(){
Object statusBarService = getSystemService("statusbar");
Class<?> statusBarManager = null;
try {
statusBarManager = Class.forName("android.app.StatusBarManager");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Method collapseStatusBar = null;
try {
// Prior to API 17, the method to call is 'collapse()'
// API 17 onwards, the method to call is `collapsePanels()`
if (Build.VERSION.SDK_INT > 16) {
collapseStatusBar = statusBarManager.getMethod("collapsePanels");
} else {
collapseStatusBar = statusBarManager.getMethod("collapse");
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
collapseStatusBar.setAccessible(true);
try {
collapseStatusBar.invoke(statusBarService);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
Für den zweiten Teil, eine programmierter Absicht an einen Empfänger, um Feuer Ihre Tätigkeit an der Spitze des Stapels
Intent startIntent = new Intent(this, LaunchWakeupReceiver.class);
PendingIntent wakeupIntent = PendingIntent.getBroadcast(this, 0, startIntent,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
alarm.set(AlarmManager.RTC, (new Date()).getTime()+10000, wakeupIntent);
und dies ist der Empfänger zu starten:
public class LaunchWakeupReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
intent = new Intent(context,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
So Zum Beispiel könnte Ihre Haupttätigkeit wie folgt aussehen:
public class MainActivity extends AppCompatActivity {
ViewGroup viewGroup;
WindowManager windowManager;
final static WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS |
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION |
WindowManager.LayoutParams.FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, //Covers status bar
PixelFormat.TRANSPARENT);
final static int flags = 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
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
private static final String LAUNCHED = "launched";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addCoverView();
}
private void addCoverView(){
final View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(flags);
viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.windowlayout, null);
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
final SharedPreferences shP = PreferenceManager.getDefaultSharedPreferences(this);
if (shP.contains(LAUNCHED)) {
collapseStatusBar();
windowManager.addView(viewGroup, params);
}
viewGroup.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
windowManager.removeView(viewGroup);
}
});
Intent startIntent = new Intent(this, LaunchWakeupReceiver.class);
PendingIntent wakeupIntent = PendingIntent.getBroadcast(this, 0, startIntent,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
alarm.set(AlarmManager.RTC, (new Date()).getTime()+10000, wakeupIntent);
shP.edit().putBoolean(LAUNCHED,true).apply();
}
private void collapseStatusBar(){
Object statusBarService = getSystemService("statusbar");
Class<?> statusBarManager = null;
try {
statusBarManager = Class.forName("android.app.StatusBarManager");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Method collapseStatusBar = null;
try {
// Prior to API 17, the method to call is 'collapse()'
// API 17 onwards, the method to call is `collapsePanels()`
if (Build.VERSION.SDK_INT > 16) {
collapseStatusBar = statusBarManager.getMethod("collapsePanels");
} else {
collapseStatusBar = statusBarManager.getMethod("collapse");
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
collapseStatusBar.setAccessible(true);
try {
collapseStatusBar.invoke(statusBarService);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
Ich bin mir bewusst, dass diese Lösung ziemlich rau ist, aber, in meine Tests, es funktioniert. Lass mich wissen, woran denkst du?
EDIT
Der Empfängerteil ist eigentlich nur zu Testzwecken. So ist das „LockActivity“ sollte wie folgt aussehen:
public class LockActivity extends AppCompatActivity {
ViewGroup viewGroup;
WindowManager windowManager;
final static WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS |
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION |
WindowManager.LayoutParams.FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, //Covers status bar
PixelFormat.TRANSPARENT);
final static int flags = 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
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addCoverView();
}
private void addCoverView(){
final View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(flags);
viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.windowlayout, null);
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
collapseStatusBar();
windowManager.addView(viewGroup, params);
viewGroup.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
windowManager.removeView(viewGroup);
}
});
}
private void collapseStatusBar(){
Object statusBarService = getSystemService("statusbar");
Class<?> statusBarManager = null;
try {
statusBarManager = Class.forName("android.app.StatusBarManager");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Method collapseStatusBar = null;
try {
// Prior to API 17, the method to call is 'collapse()'
// API 17 onwards, the method to call is `collapsePanels()`
if (Build.VERSION.SDK_INT > 16) {
collapseStatusBar = statusBarManager.getMethod("collapsePanels");
} else {
collapseStatusBar = statusBarManager.getMethod("collapse");
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
collapseStatusBar.setAccessible(true);
try {
collapseStatusBar.invoke(statusBarService);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
statt in auf erstellen Sie Ihre Vollbild-Fahnen mit, warum nicht Sie es in auf Lebenslauf setzen. Anstatt in der Aktivität selbst so viele Flags zu setzen, können Sie dieses Theme einfach dem Manifest android hinzufügen: theme = "@ style/Theme.AppCompat.Light.NoActionBar.FullScreen". –
Ich wünschte, es wäre so einfach. Nichts davon funktioniert, ich habe alles versucht. – Kyle
Kannst du mir eine App mit dem gewünschten Verhalten verlinken? Also kann ich genauer hinschauen. –