Почему активность называется дважды? - PullRequest
2 голосов
/ 04 ноября 2011

Итак, я объясню свою ситуацию.У меня есть служба, которая ловит события от кнопки питания.В службе у меня есть широковещательный приемник, который принимает Intent.ACTION_SCREEN_OFF и Intent.ACTION_SCREEN_ON.

// BroadcastReceiver for handling ACTION_SCREEN_OFF.
public BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Check action just to be on the safe side.
        if ((intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) ||
                (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) ) {

            if((System.currentTimeMillis() - delta) < DOUBLE_CLICK_INTERVAL) 
            {
                count++;
                Log.e("AAAAAAAA", "count= "+count);
            }else{
                count = 0;
            }

            if(count == 4){
                Log.e("AAAAAAAA", "EVENT TRIGGERED!!!!!");
                Intent alarmIntent = new Intent("com.myaction.action.EVENT_TRIGGERED");
                sendBroadcast(alarmIntent);
            }

            delta = System.currentTimeMillis();
        }
    }
};

Я регистрирую получателя в onCreate и отменяю его регистрацию в onDestroy ().У меня есть другой BroadcastReceiver (это зарегистрировано в манифесте), который ловит мое действие (EVENT_TRIGGERED).Приемник вещания запускает действие, которое переносит диалоговое окно.

public class AlarmBroadReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {

    Log.e("BROADCAST", "----------GOT THE EVENT---------");

    Intent newActivityDialog = new Intent(context, NotifyDialog.class);
    newActivityDialog .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(newActivityDialog );

}}

Активность, вызываемая вещанием, следующая:

public class NotifyDialog extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    Log.e("DIALOGACTIVITY", "ON CREATE");
    final Window win = getWindow();
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                  | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                  | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);




}



@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    Log.e("DIALOGACTIVITY", "ON START");
    displayAlert();
}





@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    Log.e("DIALOGACTIVITY", "ON RESUME");
}





@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    Log.e("DIALOGACTIVITY", "ON PAUSE");
}


@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Log.e("DIALOGACTIVITY", "ON DESTROY");
}





private void displayAlert()
{
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Random question?").setCancelable(
            false).setPositiveButton("Yes",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    //do somethin

                    dialog.cancel();
                    finish();
                }
            }).setNegativeButton("No",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                    finish();
                }
            });
    AlertDialog alert = builder.create();
    alert.show();
}}

Когда я нажимаю (несколько раз) кнопку питания,мое действие транслируется и перехватывается соответствующим получателем, который запускает действие.Моя проблема в том, что activiy вызывается дважды, и я не понимаю причину, журнал дает представление о том, что происходит:

11-04 16:20:22.339: E/AAAAAAAA(19451): count= 1
11-04 16:20:22.562: E/AAAAAAAA(19451): count= 2
11-04 16:20:22.886: E/AAAAAAAA(19451): count= 3
11-04 16:20:22.983: E/AAAAAAAA(19451): count= 4
11-04 16:20:22.983: E/AAAAAAAA(19451): EVENT TRIGGERED!!!!!
11-04 16:20:23.073: E/AAAAAAAA(19451): count= 5
11-04 16:20:23.077: E/MAMT FESC(19451): ----------GOT SOMETHING---------
11-04 16:20:23.085: E/DIALOGACTIVITY(19451): ON CREATE
11-04 16:20:23.085: E/DIALOGACTIVITY(19451): ON START
11-04 16:20:23.112: E/DIALOGACTIVITY(19451): ON RESUME
11-04 16:20:23.499: E/DIALOGACTIVITY(19451): ON PAUSE
11-04 16:20:23.499: E/DIALOGACTIVITY(19451): ON DESTROY
11-04 16:20:23.554: E/WindowManager(19451): Activity com.notfall.NotifyEmergencyCall has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@482c8228 that was originally added here
11-04 16:20:23.554: E/WindowManager(19451): android.view.WindowLeaked: Activity com.notfall.NotifyEmergencyCall has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@482c8228 that was originally added here
11-04 16:20:23.554: E/WindowManager(19451):     at android.view.ViewRoot.<init>(ViewRoot.java:247)
11-04 16:20:23.554: E/WindowManager(19451):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:181)
11-04 16:20:23.554: E/WindowManager(19451):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:124)
11-04 16:20:23.554: E/WindowManager(19451):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
11-04 16:20:23.554: E/WindowManager(19451):     at android.app.Dialog.show(Dialog.java:241)
11-04 16:20:23.554: E/WindowManager(19451):     at com.notfall.NotifyEmergencyCall.displayAlert(NotifyEmergencyCall.java:115)
11-04 16:20:23.554: E/WindowManager(19451):     at com.notfall.NotifyEmergencyCall.onStart(NotifyEmergencyCall.java:54)
11-04 16:20:23.554: E/WindowManager(19451):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
11-04 16:20:23.554: E/WindowManager(19451):     at android.app.Activity.performStart(Activity.java:3781)
11-04 16:20:23.554: E/WindowManager(19451):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636)
11-04 16:20:23.554: E/WindowManager(19451):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-04 16:20:23.554: E/WindowManager(19451):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-04 16:20:23.554: E/WindowManager(19451):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-04 16:20:23.554: E/WindowManager(19451):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-04 16:20:23.554: E/WindowManager(19451):     at android.os.Looper.loop(Looper.java:123)
11-04 16:20:23.554: E/WindowManager(19451):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-04 16:20:23.554: E/WindowManager(19451):     at java.lang.reflect.Method.invokeNative(Native Method)
11-04 16:20:23.554: E/WindowManager(19451):     at java.lang.reflect.Method.invoke(Method.java:521)
11-04 16:20:23.554: E/WindowManager(19451):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
11-04 16:20:23.554: E/WindowManager(19451):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
11-04 16:20:23.554: E/WindowManager(19451):     at dalvik.system.NativeStart.main(Native Method)
11-04 16:20:23.554: E/DIALOGACTIVITY(19451): ON CREATE
11-04 16:20:23.558: E/DIALOGACTIVITY(19451): ON START
11-04 16:20:23.620: E/DIALOGACTIVITY(19451): ON RESUME
11-04 16:20:23.636: E/DIALOGACTIVITY(19451): ON PAUSE
11-04 16:20:23.815: E/DIALOGACTIVITY(19451): ON RESUME
11-04 16:20:24.105: E/AAAAAAAA(19451): count= 1
11-04 16:21:19.589: E/DIALOGACTIVITY(19451): ON PAUSE
11-04 16:21:19.667: E/DIALOGACTIVITY(19451): ON DESTROY

Я предполагаю, что утечка окна вызвана двойным вызовом активности.И, как вы можете видеть, трансляция отправляется и принимается только один раз.Извините за длинную почту, но мне пришлось объяснить всю ситуацию, чтобы вы, ребята, поняли, почему действие вызывается дважды.Спасибо, ребята.

Даниэль

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

Я не уверен, почему ваша деятельность начинается дважды, но вы можете устранить утечку, очистив диалоговое окно.Сделайте диалог переменной-членом Activity, а затем отклоните и обнулите его, если он существует.

1 голос
/ 06 марта 2014

Кроме ожидаемых случаев, я заметил, что только те действия (onCreate) вызываются дважды, которые создают новый поток или Runnable. (Я считаю, что это ошибка в Android).

Решение простое (хотя вам может не понравиться: p)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_screen);

        if(savedInstanceState == null){
            // everything else that doesn't update UI
        }
    }
0 голосов
/ 04 ноября 2011

активность не началась дважды.

потому что

   ====>at android.app.Activity.performStart(Activity.java:3781)

это начнется только один раз, когда вы создаете свое приложение.

...