2011-03-11 97 views
1

我已经创建了一个图像编辑应用程序..它由两个活动组成,主要活动导致下一个活动。一切工作正常。问题是,当我在第二个活动中按HOME键时,它现在跳到主屏幕,当我再次运行应用程序时,它会生成一个错误以强制关闭。这在第一次活动期间没有发生。我无法找到确切的问题.. 有什么办法,如果用户按HOME键,我可以杀死该活动?按Home键触发错误

下面

是surfaceview我使用的代码......它也使用线程...我想逸也正是DIS prblem正在兴起... u能请您检查出DIS

public DrawingSurface(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    getHolder().addCallback(this); 

    commandManager = new CommandManager(); 
    da=new DrawingActivity(); 
    thread = new DrawThread(getHolder()); 
} 


class DrawThread extends Thread{ 
    private SurfaceHolder mSurfaceHolder; 


    public DrawThread(SurfaceHolder surfaceHolder){ 
     mSurfaceHolder = surfaceHolder; 

    } 

    public void setRunning(boolean run) { 
     _run = run; 
    } 


    @Override 
    public void run() { 
     Canvas canvas = null; 
     b=da.getpic(); 

     while (_run){ 
      try{ 
       canvas = mSurfaceHolder.lockCanvas(null); 
       if(mBitmap == null){ 
        mBitmap = Bitmap.createBitmap (1, 1, Bitmap.Config.ARGB_8888);; 
       } 
       final Canvas c = new Canvas (mBitmap); 


       c.drawBitmap(b, 0, 0, null); 
       commandManager.executeAll(c); 

       canvas.drawBitmap (mBitmap, 0, 0,null); //first block 

      } finally { 
       mSurfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 

    } 


} 


public void addDrawingPath (DrawingPath drawingPath){ 
    commandManager.addCommand(drawingPath); 
} 

public boolean hasMoreRedo(){ 
    return commandManager.hasMoreRedo(); 
} 

public void redo(){ 
    commandManager.redo(); 
} 

public void undo(){ 
    commandManager.undo(); 
} 

public boolean hasMoreUndo(){ 
    return commandManager.hasMoreRedo(); 
} 
public Bitmap getBitmap(){ 

    return mBitmap; 
} 


public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

    mBitmap = Bitmap.createBitmap (width, height, Bitmap.Config.ARGB_8888); 

} 

public void surfaceCreated(SurfaceHolder holder) { 

    thread.setRunning(true); 
    thread.start(); 

} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    boolean retry = true; 
    thread.setRunning(false); 
    while (retry) { 
     try { 
      thread.join(); 
      retry = false; 
     } catch (InterruptedException e) { 

     } 
    } 
} 
+1

这可能有这么多的具体原因,所以你应该张贴的例外是抛出和一些代码。从那个描述中不可能回答它。 – Chris 2011-03-11 13:41:17

回答

-3

尝试该产品按键

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     Intent i = new Intent(); 
     i.setClass(Activity1.this, Activity2.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(i); 

     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

HOME KEY如何与KEYCODE_BACK关联!我认为这是为BACK btn! – sat 2011-03-11 13:45:44

+0

按HOME不会触发onKeyDown – 2012-01-31 21:28:51

0

在您的活动将这个杀人的HOME按键

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_HOME) { 
     android.os.Process.killProcess(android.os.Process.myPid()); 
    } 
    return true; 
} 

应用奇怪的是,即使BACK按钮也不会退出它。

+0

thnx的答案,但它不工作......是有关表面视图和线程..? – user632905 2011-03-12 06:52:36

+0

你的意思是什么不起作用?你的环境是什么? – 2011-03-12 11:17:50

+0

它没有工作,因为你无法检测到家庭按键事件.. – user632905 2011-07-22 12:25:07

0

让我们知道当您将应用程序置于前台时您会得到什么异常。

发生这种情况时,您尚未重新初始化某些对象或变量。

您需要在onPause()方法中将共享首选项中变量的值保存为空值。您可以从SharedPrefs中获取这些值,并将它们分配回变量,或重新创建onResume()方法中为空的对象。

当Android在低内存上运行时,它在应用程序转到后台时会杀死一些活动或清除一些变量和对象。为什么你要好好照顾它,在的onPause()和的onResume()NMETHODS那...

希望它可以帮助...