Android:如果从通知栏恢复应用程序,绘制的canvas颜料不见了

我正在绘制应用程序,并希望从通知栏继续活动。 我已经添加了代码,从研究如下恢复(而不是创build)从通知栏。

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); } 

题:

绘图板正在与涂料可以绘制上。 按住主页button,从长按主屏幕恢复,线条仍然在那里。 然而,从通知栏恢复,所有的线都消失了,绘图板又重新开始显示onCreate_NewDialog。

为什么如果从通知栏恢复画线,但如果从长时间的主屏幕恢复,仍然存在?

更换:

 notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

通过:

 notificationIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY); 

现在,你从历史中调用活动,而不是创build新的类。

绘图板正在与涂料可以绘制上。 按住主页button,从长按主屏幕恢复,线条仍然在那里。

好。

然而,从通知栏恢复,所有的线都消失了,绘图板重新开始重新显示onCreate_NewDialog。

这似乎是由于您正在使用的创build标志发生: notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ,如文档所述:

如果设置,此活动将成为此历史堆栈上新任务的开始。

您可以尝试其他标志组合,例如, notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 但是请注意,这将改变“正常”回栈的行为。

除此之外,您可能需要处理您的应用的当前状态。 尝试在开发者设置下启用“不要保留活动”,然后尝试通过活动历史logging恢复您的应用程序。

我认为问题是在onDraw for循环 – 可能path,colorsMap和widthMap是空的,当你重新创build你的看法。 你何时何地设置他们的数据?

无论哪种方式,这不是通知的问题 – 这是您的数据持久性的问题。 如果您在设备的“开发人员选项”中选中“不保留活动”选项,则可能会观察到相同的错误。