Android: рисованная холстная краска исчезнет, ​​если возобновить приложение из панели уведомлений

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

Doodlz2

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); // inflate the layout generateNotification(Doodlz2.this, getResources().getString(R.string.app_name)); Display display = getWindowManager().getDefaultDisplay(); Constants.SCREEN_W = display.getWidth(); // deprecated Constants.SCREEN_H = display.getHeight(); // deprecated doodleView = (DoodleView2) findViewById(R.id.doodleView); doodleView.setOnTouchListener(this); doodleView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Constants.DRAW_W = doodleView.getWidth(); Constants.DRAW_H = doodleView.getHeight(); } }); OnCreate_NewDialog(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onDestroy() { super.onDestroy(); } private static void generateNotification(Context context, String message) { Intent notificationIntent = new Intent(context, Doodlz2.class); notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.logo) .setContentTitle(context.getString(R.string.app_name)) .setContentIntent(intent) .setPriority(5) //private static final PRIORITY_HIGH = 5; .setContentText(message) .setAutoCancel(true) .setDefaults(Notification.DEFAULT_LIGHTS); NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(0, mBuilder.build()); } 

DoodleView2

 public DoodleView2(Context c, AttributeSet attrs) { super(c, attrs); context_new = c; setFocusable(true); setFocusableInTouchMode(true); //setLayerType(View.LAYER_TYPE_SOFTWARE, null); // for solely removing the black eraser mPath = new Path(); mCanvas = new Canvas(); mBitmapPaint = new Paint(Paint.DITHER_FLAG); Constants.mPaint = new Paint(); Constants.mPaint.setAntiAlias(true); // smooth edges of drawn line Constants.mPaint.setDither(true); Constants.mPaint.setColor(Color.BLACK); // default color is black Constants.mPaint.setStyle(Paint.Style.STROKE); // solid line Constants.mPaint.setStrokeJoin(Paint.Join.ROUND); Constants.mPaint.setStrokeWidth(5); // set the default line width Constants.mPaint.setStrokeCap(Paint.Cap.ROUND); // rounded line ends } @Override public void onSizeChanged(int w, int h, int oldW, int oldH) { super.onSizeChanged(w, h, oldW, oldH); mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); mBitmap = getResizedBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.bdg6),h,w); } @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(mBitmap, 0, 0, null); // draw the background screen for (Path p : paths) { Constants.mPaint.setColor(colorsMap.get(p)); Constants.mPaint.setStrokeWidth(widthMap.get(p)); canvas.drawPath(p, Constants.mPaint); } Constants.mPaint.setColor(selectedColor); Constants.mPaint.setStrokeWidth(selectedWidth); canvas.drawPath(mPath, Constants.mPaint); } 

Вопрос:

Пластина для рисования работает с красками. Нажимая кнопку «домой» и возобновляя ее с экрана длительного нажатия, линии все еще присутствуют. Однако, возобновив работу с панели уведомлений, все строки исчезли, и чертежная пластина снова перезапущена, показывая onCreate_NewDialog.

Почему нарисованные линии исчезают, если они возобновляются с панели уведомлений, но все же там, если они возобновляются с длинного нажатия главного экрана?

Заменить:

 notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

от:

 notificationIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); 

Теперь вы вызываете активность из истории вместо создания нового класса.

Пластина для рисования работает с красками. Нажимая кнопку «домой» и возобновляя ее с экрана длительного нажатия, линии все еще присутствуют.

Хорошо.

Однако, возобновив работу с панели уведомлений, все строки исчезли, и чертежная пластина снова перезапущена, показывая onCreate_NewDialog.

Кажется, что это происходит из-за используемого флага создания: notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); , Как указано в документации :

Если установлено, это действие станет началом новой задачи в этом стеке истории.

Вы можете попробовать другие комбинации флагов, например, notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); Но имейте в виду, что это изменит поведение «нормального» обратного стека.

В дополнение к этому, возможно, вам нужно обработать текущее состояние вашего приложения. Попробуйте включить «Не выполнять действия» в настройках разработчика, а затем попытайтесь возобновить свое приложение через историю действий.

Я думаю, проблема в цикле for в onDraw – возможно, пути, colorsMap и widthMap пусты, когда вы воссоздаете свое представление. Когда и где вы устанавливаете свои данные?

В любом случае, это не проблема с уведомлениями – это проблема с сохранением данных. Вероятно, такая же ошибка может наблюдаться, если вы установите флажок «Не выполнять действия» в настройках разработчика.