android - الحفاظ على النشاط دائما على رأس كومة، أو في التركيز عندما تطبيقات المارقة إطلاق الأنشطة؟




dialog fullscreen (2)

لدي نشاط ملء الشاشة غامرة التي يجب أن تبقى ملء الشاشة حتى يخرج المستخدم صراحة. (على سبيل المثال، فكر في شيء مثل مشاهدة فيديو يوتيوب ملء الشاشة).

ومع ذلك، لقد لاحظت مؤخرا أن الكثير من الأنشطة غير المرغوب فيها إطلاق يمكن كسر سلوك التطبيق الخاص بي. على سبيل المثال، العديد من "التطبيقات المجانية" الظليلة تميل إلى توليد أنشطة شفافة على كامل الشاشة وعرض الإعلانات، وتعطيل المستخدم على الفور. تنبثق النوافذ المنبثقة من "ملء الشاشة" من تطبيقات معينة والتي هي في الواقع أنشطة بملء الشاشة أيضا على الفور في تعطيل نشاطي.

هل هناك طريقة لتجنب هذه الأنشطة سرقة التركيز، أو وسيلة للحفاظ عليها وراء بلدي ملء الشاشة النشاط حتى لا كسر بلدي وضع ملء الشاشة؟ وبعبارة أخرى، كيف يمكنني الحفاظ على نشاطي دائما على رأس كلما تقرر بعض المارقة التطبيق لإطلاق نشاط على الألغام؟

لا تحتاج إلى إلغاؤها، ولكن "وضعت وراءها في الوقت الراهن" حتى يخرج المستخدم النشاط ملء الشاشة.

وهناك طريقة التي تتبادر إلى الذهن سيكون لإعادة إطلاق نشاطي مع FLAG_ACTIVITY_REORDER_TO_FRONT لحظة يفقد التركيز، ولكن هذا لن تبدو جميلة للمستخدم :(

ملاحظة: إذا كنت ترغب في محاولة ذلك بنفسك، لقد وجدت التطبيق الذي "يحاكي" هذه الأنشطة المارقة إطلاق. تنزيل هذا - https://play.google.com/store/apps/details؟id=com.nlucas.popupnotificationslite&hl=ar

كلما تلقيت إشعارات، فإنها تطلق نشاطا شفافا على كامل الشاشة. حاول مشاهدة فيديو يوتيوب والحصول على 10 إخطارات من شخص ما وتخيل كيف تشتيت سيكون.

تحديث: لا يبدو أن القيام بهذا العمل:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (!hasFocus) {
        Intent i = new Intent(getBaseContext(), MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
        startActivity(i);
}

أفضل رهان هو استخدام "تثبيت الشاشة" (كما قدم هنا ، الجديد في الروبوت L). أي شيء آخر هو الإختراق أو الحل البديل التي لن تكون متوافقة إلى الأمام.

أن تكون حادة، الروبوت لم يكن حقا مصممة للسماح التطبيق دون قيد أو شرط وتولي بالكامل على الجهاز. تم تصميم الروبوت ليكون أداة للمستخدم الذي يستجيب لرغباتهم. إذا رغبتهم في ترك التطبيق، لماذا يجب أن تجعل من الصعب؟ أيضا، إذا كان المستخدم يرغب في الحصول على تطبيقات ظليلة أن أنشطة بداية غير متوقعة، ثم يكون ذلك. الجميع يلعب بنفس القواعد التي وضعها النظام.


يمكنك تشغيل خدمة في الخلفية التي يتحقق كل ذلك في كثير من الأحيان من شأنها أن تبقي التطبيق الخاص بك على القمة:

public class ServiceKeepInApp extends Service {

//private static boolean sendHandler = false;
KeepInAppHandler taskHandler = new KeepInAppHandler(this);


@Override
public void onCreate() {
    super.onCreate();
    //sendHandler = true;

    taskHandler.sendEmptyMessage(0);
}

@Override
public void onDestroy() {
    super.onDestroy();
    //sendHandler = false;
    taskHandler.removeCallbacksAndMessages(0);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

private static class KeepInAppHandler extends Handler {
    private final WeakReference<ServiceKeepInApp> mService;
    private Context context;
    private boolean sendHandler = false;

    public KeepInAppHandler(ServiceKeepInApp mService) {
        this.mService = new WeakReference<ServiceKeepInApp>(mService);
        this.context = mService;
        this.sendHandler = true;

    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        ActivityManager activityManager = (ActivityManager)context.getSystemService(Service.ACTIVITY_SERVICE);

        if (activityManager.getRecentTasks(2, 0).size() > 0) {
            if (activityManager.getRecentTasks(2, 0).get(0).id != GlobalVars.taskID) {
                activityManager.moveTaskToFront(GlobalVars.taskID, 0);
            }

            if (sendHandler) {
                sendEmptyMessageDelayed(0, 1000);
            }
        }


    }

}

}

ثم لديك فئة سينغلتون:

public static class GlobalVars { 
   public static int taskID;
   public static Intent keepInApp;

}

ثم في النشاط الخاص بك:

public class MyActivity extends Activity { 

     @Override
     public void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);

         GlobalVars.taskID = getTaskId();

         GlobalVars.keepInApp = new Intent(this, ServiceKeepInApp.class);
         startService(GlobalVars.keepInApp);
     }
}




fullscreen