Как сделать уведомление возобновлением и не воссоздать деятельность?

18

Мне показалось, что я понял это, но после некоторой отладки по этому вопросу: Как чтобы сделать уведомление неприемлемым / неустранимым Я только осознал, что моя деятельность по-прежнему распространяется на Create () и onDestroyed () в случайном порядке.

Мой манифест для активности:

<activity
        android:name="***.***.***.*****"
        android:configChanges="orientation|keyboardHidden"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:launchMode="singleTop" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Я также пробовал launchmodes singleTask, singleInstance.

Мой код намерения для уведомления:

Intent intent = new Intent(context, MyClass.class);
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    //intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
    //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    //intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
    //intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

Как вы можете видеть, я пробовал каждый флаг, который, казалось бы, был бы уместным, но не повезло ...

Это дает некоторые нежелательные артефакты, такие как перезапуск моего AlarmManager и запуск задачи запуска alarmmanager при каждом нажатии на уведомление. Я бы хотел этого избежать.

Любые предложения?

Изменить: я знаю, что есть масса вопросов, подобных этому, но ни одно из предлагаемых решений не похоже на трюк здесь ...: /

Edit2: по запросу, вот мой класс:

package ***.***.***;

import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.PorterDuff;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class MyClass extends FragmentActivity {


private static String userName;
String password;
private static Boolean LoggedIn = false;
private static Boolean RunningState = false;
private static Boolean OnlineState = false;
private static String LastReportTime;

private static Boolean isVisible = true;
private static Boolean firstStart = true;

private static TextView onlineTextView;
private static TextView reportTimeTextView;
private static TextView runningStatusTextView;
private static TextView userLoggedInTextView;

private static Context context;

public static final String PREFS_NAME = "Settings";

public static final String NOTIFICATION_RUNNING_OK = "Reporting Active";
public static final String NOTIFICATION_USER_STOPPED = "Reporting Stopped";
public static final String NOTIFICATION_NO_NETWORK = "No Network Connected";
public static final String NOTIFICATION_NO_CONNECTION = "No Connection To Server";

public static final int NOTIFICATION_ID = 10;

public static final int LOGIN_REQUEST_CODE = 1;
public static final int WAKEUP_LOGIN_REQUEST_CODE = 2;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    Log.d("MyClass", "Main onCreate() Called");

    loadVariables();

    com.remobjects.sdk.TypeManager.setPackage("com.remobjects.sdk");
    //if (firstStart)
    //{
        Log.d("MyClass", "Main onCreate() firstStart Called");
        if (RunningState && checkConnection())
        {
           // After runLogin(), onResume() gets called here again immediately
            setLoginCode(LOGIN_REQUEST_CODE);
            runLogin();
        }
        else
            init();
    //}
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
}

@Override
public void onResume()
{
    super.onResume();

    Log.d("MyClass", "Main onResume() Called");
    //firstStart gets set to false during login
    if (!firstStart)
    {
        Log.d("MyClass", "Main onResume() !firstStart Called");
        loadVariables();
        setVisible(true);
        updateUI();
    }
}

@Override
protected void onPause()
{
    super.onPause();
    saveVariables();
    setVisible(false);
}

@Override
protected void onStop()
{
    super.onStop();

    saveVariables();
    setVisible(false);
}

@Override
public void onDestroy()
{
    super.onDestroy();
    //cancelNotification();
    Log.e("MyClass", "onDestroy() called");
    saveVariables();
    setVisible(false);
    //setFirstStart(true);
}


private void loadVariables()
{
    SharedPreferences sharedPrefs = getSharedPreferences(PREFS_NAME, 0);

    userName = sharedPrefs.getString("userName", "");
    RunningState = sharedPrefs.getBoolean("RunningState", true);
    LoggedIn = sharedPrefs.getBoolean("LoggedIn", false);
    OnlineState = sharedPrefs.getBoolean("OnlineState", false);
    LastReportTime = sharedPrefs.getString("LastReportTime", "");

    context = this.getApplicationContext();
}

private static void saveVariables()
{
    SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();

    editor.putString("userName", userName);
    editor.putBoolean("RunningState", RunningState);
    editor.putBoolean("LoggedIn", LoggedIn);
    editor.putBoolean("OnlineState", OnlineState);
    editor.putString("LastReportTime", LastReportTime);

    editor.commit();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_my_class, menu);
    return true;
}

private Boolean checkConnection()
{
    Log.d("MyClass", "checkConnection()");
    ConnectivityManager cnnxManager = (ConnectivityManager) 
            getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo ni = cnnxManager.getActiveNetworkInfo();

    if (ni != null && ni.isAvailable() && ni.isConnected()) 
    {
        OnlineState = true;
        return true;
    }
    OnlineState = false;
    return false;
}

public void runLogin()
{
    Intent intent = new Intent(context, LoginActivity.class);
    startActivityForResult(intent, getLoginCode());
    Log.d("MyClass", "runLogin()");
}

private void init()
{
    Log.d("MyClass", "init()");
    setContentView(R.layout.activity_field_agent);

    onlineTextView = (TextView)findViewById(R.id.onlineStatusTextView);
    reportTimeTextView = (TextView)findViewById(R.id.lastReportTimeTextView);
    runningStatusTextView = (TextView)findViewById(R.id.runningStatusTextView);
    userLoggedInTextView = (TextView)findViewById(R.id.userLoggedInTextView);

    findViewById(R.id.button_online).getBackground().setColorFilter(0xFF00FF00, PorterDuff.Mode.MULTIPLY);
    findViewById(R.id.button_highRisk).getBackground().setColorFilter(0xFFFFA500, PorterDuff.Mode.MULTIPLY);
    findViewById(R.id.button_alarm).getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);

    setVisible(true);

    updateUI();

    if (RunningState)
    {
        setupAlarmManager(AlarmManager.INTERVAL_FIFTEEN_MINUTES);
        // Here onResume() gets called again
        updateNotificationText(NOTIFICATION_RUNNING_OK);

        Button temp = (Button)findViewById(R.id.button_online);
        temp.setCompoundDrawablesWithIntrinsicBounds(R.drawable.check_box, 0, R.drawable.check_box, 0);
    }
    else
    {
        //cancelAlarmManager();

        updateNotificationText(NOTIFICATION_USER_STOPPED);

        Button temp = (Button)findViewById(R.id.button_offline);
        temp.setCompoundDrawablesWithIntrinsicBounds(R.drawable.check_box, 0, R.drawable.check_box, 0);
    }
}

private void updateUI() 
{
    Log.d("MyClass", "updateUI()");

    updateUserLoggedInStatus(userName);

    updateOnlineStatus(OnlineState);

    updateRunningStatus(RunningState);

    updateReportTimeStatus(LastReportTime);
}

public void offDutyButton_click(View view)
{
    cancelAlarmManager();
    Button temp = (Button)findViewById(R.id.button_offline);
    temp.setCompoundDrawablesWithIntrinsicBounds(R.drawable.check_box, 0, R.drawable.check_box, 0);

    temp = (Button)findViewById(R.id.button_online);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);

    temp = (Button)findViewById(R.id.button_highRisk);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);

    temp = (Button)findViewById(R.id.button_alarm);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
}

public void onDutyButton_click(View view)
{
    Button temp = (Button)findViewById(R.id.button_online);
    temp.setCompoundDrawablesWithIntrinsicBounds(R.drawable.check_box, 0, R.drawable.check_box, 0);

    temp = (Button)findViewById(R.id.button_offline);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);

    temp = (Button)findViewById(R.id.button_highRisk);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);

    temp = (Button)findViewById(R.id.button_alarm);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
    //cancelAlarmManager();
    setupAlarmManager(AlarmManager.INTERVAL_FIFTEEN_MINUTES);
}

public void highRiskButton_click(View view)
{
    Button temp = (Button)findViewById(R.id.button_highRisk);
    temp.setCompoundDrawablesWithIntrinsicBounds(R.drawable.check_box, 0, R.drawable.check_box, 0);

    temp = (Button)findViewById(R.id.button_online);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);

    temp = (Button)findViewById(R.id.button_offline);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);

    temp = (Button)findViewById(R.id.button_alarm);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
}

public void alarmButton_click(View view)
{
    Button temp = (Button)findViewById(R.id.button_alarm);
    temp.setCompoundDrawablesWithIntrinsicBounds(R.drawable.check_box, 0, R.drawable.check_box, 0);

    temp = (Button)findViewById(R.id.button_online);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);

    temp = (Button)findViewById(R.id.button_highRisk);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);

    temp = (Button)findViewById(R.id.button_offline);
    temp.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
}

public static void setButtonIcon(int inId)
{

}

public static void showToast(String inString, Context context)
{
    Toast.makeText(context, inString.toString(), Toast.LENGTH_SHORT).show();
}

public static void updateOnlineStatus(Boolean inStatus)
{
    if (isVisible)
    {
        if (inStatus)
            onlineTextView.setText("Online");
        else
            onlineTextView.setText("Offline");
    }
}

public static void updateReportTimeStatus(String inString)
{
    if (isVisible)
        reportTimeTextView.setText(inString);
}

public static void updateRunningStatus(Boolean inStatus)
{
    if (isVisible)
    {
        if (inStatus)
            runningStatusTextView.setText("Reporting");
        else
            runningStatusTextView.setText("Not Reporting");
    }
}

public static void updateUserLoggedInStatus(String inString)
{
    if (isVisible)
        userLoggedInTextView.setText(inString);
}


//
//
// Getters and Setters
//
//
public static void setLoggedIn(Boolean inBool)
{
    LoggedIn = inBool;
}

public static Boolean getLoggedIn()
{
    return LoggedIn;
}

public static void setRunningState(Boolean inBool)
{
    RunningState = inBool;
}

public static Boolean getRunningState()
{
    return RunningState;
}

public static void setVisible(Boolean inBool)
{
    isVisible = inBool;
}

public static Boolean getVisible()
{
    return isVisible;
}

public static void setUsername(String inString)
{
    userName = inString;
}

public static String getUsername()
{
    return userName;
}

public static void setLastReportTime(String inString)
{
    LastReportTime = inString;
}

public static String getLastReportTime()
{
    return LastReportTime;
}

public static Context getAppContext()
{
    return MyClass.context;
}

public static void setLoginCode(int code)
{
    SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();

    editor.putInt("LoginCode", code);

    editor.commit();
}

public static int getLoginCode()
{
    SharedPreferences sharedPrefs = context.getSharedPreferences(PREFS_NAME, 0);

    return sharedPrefs.getInt("LoginCode", 1);
}

public static void setFirstStart(Boolean inBool)
{
    firstStart = inBool;
}

public static Boolean getFirstStart()
{
    return firstStart;
}

//
//
//
//
//
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (LOGIN_REQUEST_CODE) : {
      if (resultCode == Activity.RESULT_OK) {
        LoggedIn = data.getBooleanExtra("LoggedIn", false);
        userName = data.getStringExtra("Username");

        init();
      }
      break;
    }
    case (WAKEUP_LOGIN_REQUEST_CODE) : {
        if (resultCode == Activity.RESULT_OK) {
          LoggedIn = data.getBooleanExtra("LoggedIn", false);
          userName = data.getStringExtra("Username");

          cancelAlarmManager();
          setupAlarmManager(AlarmManager.INTERVAL_FIFTEEN_MINUTES);
        }
        break;
    }
  }
}

//
//
// AlarmManager
//
//

public static void setupAlarmManager(long interval)
{
    AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent alarmIntent = new Intent(context, LaunchReceiver.class); 
    PendingIntent pendingAlarmIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, alarmIntent, 0);
    alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, interval,  pendingAlarmIntent);

    RunningState = true;
    updateRunningStatus(RunningState);

    updateNotificationText(NOTIFICATION_RUNNING_OK);

    Log.d("MyClass", "AlarmManager Started");
}


public static void cancelAlarmManager()
{
    Intent intent = new Intent(context.getApplicationContext(), LaunchReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    alarmMgr.cancel(pendingIntent);

    RunningState = false;
    updateRunningStatus(RunningState);

    updateNotificationText(NOTIFICATION_USER_STOPPED);

    Log.d("MyClass", "AlarmManager Stopped");

    Intent serviceIntent = new Intent(context, MonitorService.class);
    context.stopService(serviceIntent);
    Log.d("MyClass", "Stopping MonitorService");
}



//
//
// Notification
//
//

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static void createNotification()
{
    NotificationManager notificationManager = (NotificationManager)context.getSystemService(NOTIFICATION_SERVICE);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
                            .setContentTitle("blablabla")
                            .setContentText("Getting Status")
                            .setSmallIcon(R.drawable.ic_launcher)
                            .setOngoing(true)
                            .setAutoCancel(false);

    Intent intent = new Intent(context, MyClass.class);
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    //intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
    //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    //intent.setFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
    //intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(MyClass.class);
    stackBuilder.addNextIntent(intent);

    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,  PendingIntent.FLAG_UPDATE_CURRENT);

    builder.setContentIntent(pendingIntent);

    /*Notification noti = builder.build();
    noti.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT;*/

    notificationManager.notify(NOTIFICATION_ID, builder.build());
}

public static void updateNotificationText(String inString)
{
    NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
                                            .setContentText(inString)
                                            .setContentTitle("blablabla")
                                            .setSmallIcon(R.drawable.ic_launcher)
                                            .setOngoing(true)
                                            .setAutoCancel(false);

    Intent intent = new Intent(context, MyClass.class);
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(MyClass.class);
    stackBuilder.addNextIntent(intent);

    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,  PendingIntent.FLAG_UPDATE_CURRENT);

    builder.setContentIntent(pendingIntent);

    /*Notification noti = builder.build();
    noti.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT;*/

    notificationManager.notify(NOTIFICATION_ID, builder.build());
}

public static void cancelNotification()
{
    NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.cancel(NOTIFICATION_ID);
}
}

Как уже упоминалось в комментариях, после запуска loginActivity, onResume () здесь снова вызывает вызов. То же самое после запуска alarmManager.

Кроме того, каждый раз, когда сигнализатор AlarmManager гаснет, он, кажется, выводит приложение на передний план. Любой способ избежать этого?

    
задан CeeRo 03.06.2013 в 15:35
источник
  • Действия никогда не создаются и не уничтожаются в случайном порядке. Пожалуйста, разместите все соответствующие коды. (код для класса, создающего уведомление, и класс, к которому приводит уведомление) –  Knossos 03.06.2013 в 19:40
  • @Knossos Я добавил соответствующий класс –  CeeRo 04.06.2013 в 11:16
  • это помогло мне stackoverflow.com/questions/3305088/... –  TharakaNirmana 14.09.2016 в 09:47

5 ответов

32

Похоже, проблема была вызвана этими строками в коде-уведомлении (взята прямо из руководства Android при уведомлениях:

TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(FieldAgent.class);
    stackBuilder.addNextIntent(intent);

    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0,  PendingIntent.FLAG_UPDATE_CURRENT);

Заменяя их на регулярный ожидающий ответ, он решил:

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Полный пример

Intent intent = new Intent(getApplicationContext(), myactivity.class);
PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), (int)System.currentTimeMillis(), intent, 0);

Notification myNotification  = new Notification.Builder(getApplicationContext())
                        .setContentTitle("Title")
                        .setContentText("Some text....")
                        .setSmallIcon(R.drawable.myicon)
                        .setContentIntent(pIntent)
                        .setAutoCancel(true).build();


NotificationManager notificationManager =
                        (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

notificationManager.notify(0, myNotification);
    
ответ дан CeeRo 04.06.2013 в 15:38
источник
  • спасибо за этот улов! –  Adgezaza 04.07.2013 в 00:52
  • Это очень помогло мне - спасибо –  Jaison Brooks 08.12.2013 в 08:51
  • @CeeRo: Ты просто спас мне здравый смысл, спасибо –  Baggers 23.10.2015 в 18:59
  • Большое спасибо! Я действительно пытался использовать PendingIntent.getActivity (контекст, 0, намерение, PendingIntent.FLAG_UPDATE_CURRENT); и TaskStackBuilder. В моем случае я использовал System.currentTimeMillis (), чтобы получить PendingIntent –  Matthias 13.11.2015 в 15:29
5

В моем случае ответ CeeRo работал, но странным образом. Я ДОЛЖЕН ОТПРАВИТЬ ТЕЛЕФОН! :)     

ответ дан zsolt világos 14.05.2015 в 11:30
источник
  • Для меня тоже это неудобно ... –  bercik 15.01.2016 в 15:40
  • Для меня тоже. Благодарю. –  mihai1990 03.01.2018 в 15:55
3

Я не знаю, был ли мой случай подобным вам или нет. Я пытался создать намерение, как вы. Я использую pageviewer + фрагмент. Мое дело, нажмите сообщение уведомления, чтобы перейти к приложению, а затем домой к главному, а затем запустите приложение снова, активность воссоздана (этот код в фрагменте класса)

Intent intent = new Intent(getActivity(),MainActivity.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent =  PendingIntent.getActivity(getActivity(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Теперь все в порядке, изменено на этот код:

Intent intent = getActivity().getIntent();
PendingIntent pendingIntent =  PendingIntent.getActivity(getActivity(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Надеюсь на эту помощь ^ _ ^

    
ответ дан Hung 08.08.2013 в 12:24
источник
1

Вы пересилили onBackPressed в своей деятельности? Я думаю, что если вы не переопределите onBackPressed, по умолчанию Android будет уничтожать (finish ()) Activity. Поэтому, вероятно, если вы вернетесь, ваше уведомление проверяет, существует ли активность, не находит и затем создает новую.

    
ответ дан unbekant 03.06.2013 в 15:55
источник
  • Это происходит, даже если у меня открыто действие, вытащите панель уведомлений и нажмите на уведомление ... –  CeeRo 03.06.2013 в 16:00
0

У вас много кода, который выполняется несколько раз.

Удалить

saveVariables();
setVisible(false);

От onStop () и onDestroy (). Этот код всегда будет запущен сначала в onPause ().

loadVariables (); может также выполняться дважды. Один раз в onCreate () и один раз в onResume ().

Может быть разумным несколько изменить логику загрузки.

Возможно, ваш код init () будет запущен дважды. Один раз в onCreate () и один раз в onActivityResult ().

TL; DR Что касается вашей реальной проблемы:

onActivityResult () иногда немного странно, потому что он не всегда срабатывает, когда вы думаете. Попробуйте загрузить переменные перед init () в onActivityResult ().

Чтобы поэкспериментировать с этим, поместите журнал в свои onCreate (), onStart (), onResume () и onActivityResult () и обратите внимание, когда они запускаются.

    
ответ дан Knossos 04.06.2013 в 12:07
источник
  • Я уже регистрирую себя как сумасшедший: P Я внес некоторые небольшие изменения, начиная и останавливая alarmManager меньше (я не думаю, что мне нужно было делать это так часто, как я). Также удалены те из onStop и onDestroy, и по какой-то странной причине, чем меньше кода у меня есть в onDestroy, тем меньше он называется вызываемым. Теперь он, кажется, вообще не вызван при нажатии на уведомления (пока, по крайней мере, я только нажал его 20-30 раз ..) ... продолжение –  CeeRo 04.06.2013 в 12:51
  • Но нажатие на уведомление по-прежнему перезапускает действие из onCreate (). Процесс после этого будет таким, каким я ожидал бы и хочу его для начала, но это не должно быть новым началом, это должно быть резюме ... Это моя настоящая проблема;) –  CeeRo 04.06.2013 в 12:51
  • На самом деле я ошибся. Я нажал на уведомление и сделал звонок onCreate, по адресу: 12:46:31, 12:46:36, 12:46:40, 12:47:55. Затем, внезапно, в 12:50:07, все onDestroy выскочили. Однако они не уничтожают мою текущую версию, так как следующая вещь в журнале после этих уничтожений - onResume () и даже ее первая версия. Я смущен. Любые идеи, которые заставляют уведомления переделывать свою деятельность? –  CeeRo 04.06.2013 в 12:58
  • Когда вы нажмете на уведомление, оно будет порождать новый экземпляр Activity. Вы можете попробовать установить режим запуска манифеста активности на «singleInstance». –  Knossos 04.06.2013 в 15:13
  • Не могу использовать singleInstance, так как мне нужно больше действий, сервисов и приемников для запуска ... Мне нужно использовать singleTop. Но я думаю, что, наконец, понял. Спасибо, что пытались помочь –  CeeRo 04.06.2013 в 15:32