本文演示如何在Android中实现程序前后台切换效果。
看到:http://www.cnblogs.com/hanyonglu/archive/2012/04/15/2450551.html
说明这种效果实现。
经过测试,发现上面的方法有不少问题,
1、HOME键是不能用的,不知道原作者是否是在2.3等老版本上做的测试,4.0上Activity中己无法捕获到HOME键了,
2、单纯的在onStop中加入处理,也是不行的,因为只要是Activity被完全覆盖,就会调用onStop, 这样一切Activity,就来了notification,这显然不是我们所要的。
3、加入Service来只处理这样一个问题,这样的消耗也太大了。
经过修改,有了下面的方法。
1、还是在onStop中做NotificationExtend的操作,但在NotificationExtend中判断是否是运行在了后台。
activityManager.getRunningAppProcesses() ==RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE
表示运行在后台。
2、不论是从哪个Activity中发出的Notification请求, 都应是操作的同一个对象,这样才能进行全局控制。
3、在onRestart中可以做cancel notification的操作。同样要有一个标志判断是否有notification目前存在才去做。
修改后代码如下:
public class MainActivity extends Activity {
private Button btnShow = null;
public Intent intent = null;
public static NotificationExtend notification = new NotificationExtend();
final static String TAG = "XUE";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// ��������
// intent = new Intent(MainActivity.this, AppStatusService.class);
// startService(intent);
Log.e(TAG,"---Main---onCreate---Activity:" + this.hashCode() + " task:" + getTaskId());
btnShow = (Button) findViewById(R.id.btnShow);
btnShow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(MainActivity.this,
ShowMessageActivity.class);
startActivity(i);
}
});
}
// ���HOME��ʱ��������̨����
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
// ����HOME��
Log.e(TAG,"---onKeyDown---");
if (keyCode == KeyEvent.KEYCODE_HOME) {
// ��ʾNotification
// AppManager.context = this;
// moveTaskToBack(true);
return true;
} else if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) {
Log.e(TAG,"---KEY---BACK---");
// ֹͣ����
// if(intent != null)
// stopService(intent);
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onAttachedToWindow() {
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
// stopService(intent);
Log.e(TAG,"---Main---onDestroy---Activity:" + this.hashCode() + " task:" + getTaskId());
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
notification.setActivity(this);
notification.showNotification();
super.onStop();
Log.e(TAG,"---Main---onStop---Activity:" + this.hashCode() + " task:" + getTaskId());
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.e(TAG,"---Main---onResume---Activity:" + this.hashCode() + " task:" + getTaskId());
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
notification.cancelNotification();
Log.e(TAG,"---Main---onRestart---Activity:" + this.hashCode() + " task:" + getTaskId());
}
}
public class ShowMessageActivity extends Activity{
private Button btnExit = null;
private NotificationExtend notification = null;
private final String TAG = "XUE";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.showmessage_activity);
Log.e(TAG,"---Show--onCreate----Activity:" + this.hashCode() + " task:" + getTaskId());
btnExit = (Button)findViewById(R.id.button1);
notification = MainActivity.notification;
btnExit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
// ����HOME��
if(keyCode == KeyEvent.KEYCODE_HOME){
// ��ʾNotification
// notification = new NotificationExtend(this);
notification.showNotification();
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
notification.setActivity(this);
notification.showNotification();
Log.e(TAG,"---Show--onStop----Activity:" + this.hashCode() + " task:" + getTaskId());
super.onStop();
}
@Override
public void onAttachedToWindow () {
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
notification.cancelNotification();
Log.e(TAG,"---Show---onRestart---Activity:" + this.hashCode() + " task:" + getTaskId());
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.e(TAG,"---Show---onResume---Activity:" + this.hashCode() + " task:" + getTaskId());
}
}
public class NotificationExtend {
private Activity context;
private final String TAG = "XUE";
private boolean flag = false;
public NotificationExtend() {
}
public void setActivity(Activity context){
this.context = context;
}
public void showNotification()
{
if (!isAppOnBackground()) {
Log.e("XUE","---XUE---Foreground---");
} else {
Log.e("XUE","---XUE---Background---");
showNotification_rl();
}
}
// ��ʾNotification
public void showNotification_rl() {
// ����һ��NotificationManager������
NotificationManager notificationManager = (
NotificationManager)context.getSystemService(
android.content.Context.NOTIFICATION_SERVICE);
Log.e("XUE", "");
// ����Notification�ĸ�������
Notification notification = new Notification(
R.drawable.icon,"TEST",
System.currentTimeMillis());
// ����֪ͨ�ŵ�֪ͨ����"Ongoing"��"��������"����
notification.flags |= Notification.FLAG_ONGOING_EVENT;
// notification.flags |= Notification.FLAG_NO_CLEAR;
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.flags |= Notification.FLAG_SHOW_LIGHTS;
// notification.defaults = Notification.DEFAULT_LIGHTS;
// notification.ledARGB = Color.BLUE;
// notification.ledOnMS = 5000;
CharSequence contentTitle = "TEST Title"; // ֪ͨ������
CharSequence contentText = "TEST Text"; // ֪ͨ������
Intent notificationIntent = new Intent(context,context.getClass());
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent contentIntent = PendingIntent.getActivity(
context, 0, notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
notification.setLatestEventInfo(
context, contentTitle, contentText, contentIntent);
// ��Notification���ݸ�NotificationManager
notificationManager.notify(TAG, 5, notification);
flag = true;
}
// ȡ��֪ͨ
public void cancelNotification(){
if(flag)
{
NotificationManager notificationManager = (
NotificationManager) context.getSystemService(
android.content.Context.NOTIFICATION_SERVICE);
notificationManager.cancel(TAG, 5);
flag = false;
}
}
public boolean isAppOnBackground() {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
// Returns a list of application processes that are running on the device
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
String packageName = context.getPackageName();
if (appProcesses == null || packageName == null) return false;
for (RunningAppProcessInfo appProcess : appProcesses) {
// The name of the process that this object is associated with.
Log.e("XUE","---isAppOnForeground------" + appProcess.processName + " packageName:" + packageName);
if (appProcess.processName.equals(packageName)
&& ((appProcess.importance == RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE))) {
return true;
}
}
return false;
}
}