【android】仿照长按home键 恢复后台运行程序
2013-01-02 23:05
429 查看
permission <uses-permission android:name="android.permission.GET_TASKS"/>
package yanbin.recent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.DataSetObserver;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;
/**
* 弹出最近任务测试
* @author yanbin
*
*/
public class MainActivity extends Activity {
private Dialog mDialog;
private static int MAX_RECENT_TASKS = 12; // allow for some discards
private static int repeatCount = 12;//保证上面两个值相等
//用来存放每一个recentApplication的信息,我们这里存放应用程序名,应用程序图标和intent。
private List<HashMap<String,Object>> appInfos = new ArrayList<HashMap<String, Object>>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
reloadButtons();//程序加载的时候就加载出最近任务
}
public void click(View view){
int id = view.getId();
switch (id) {
case R.id.btn:
generateDialog();
break;
}
}
/**
* 弹出最近任务对话框
*/
public void generateDialog(){
mDialog = new Dialog(this,R.style.dialog);
LayoutInflater mInflater = LayoutInflater.from(this);
View dialogView = mInflater.inflate(R.layout.choose_dialog, null);
final GridView mGridView = (GridView) dialogView.findViewById(R.id.choose_dialog_gridview);
mGridView.setAdapter(new MyAppAdapter());
mDialog.setContentView(dialogView);
mDialog.setCanceledOnTouchOutside(true);
mDialog.show();
}
/**
* 核心方法,加载最近启动的应用程序
* 注意:这里我们取出的最近任务为 MAX_RECENT_TASKS + 1个,因为有可能最近任务中包好Launcher2。
* 这样可以保证我们展示出来的 最近任务 为 MAX_RECENT_TASKS 个
*/
private void reloadButtons() {
//得到包管理器和activity管理器
final Context context = this;
final PackageManager pm = context.getPackageManager();
final ActivityManager am = (ActivityManager)
context.getSystemService(Context.ACTIVITY_SERVICE);
//从ActivityManager中取出用户最近launch过的 MAX_RECENT_TASKS + 1 个,以从早到晚的时间排序,
//注意这个 0x0002,它的值在launcher中是用ActivityManager.RECENT_IGNORE_UNAVAILABLE
//但是这是一个隐藏域,因此我把它的值直接拷贝到这里
final List<ActivityManager.RecentTaskInfo> recentTasks =
am.getRecentTasks(MAX_RECENT_TASKS + 1, 0x0002);
//这个activity的信息是我们的launcher
ActivityInfo homeInfo =
new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)
.resolveActivityInfo(pm, 0);
int numTasks = recentTasks.size();
for (int i = 0; i < numTasks && (i < MAX_RECENT_TASKS); i++) {
HashMap<String, Object> singleAppInfo = new HashMap<String, Object>();//当个启动过的应用程序的信息
final ActivityManager.RecentTaskInfo info = recentTasks.get(i);
Intent intent = new Intent(info.baseIntent);
if (info.origActivity != null) {
intent.setComponent(info.origActivity);
}
//TODO 测试用,无意义代码
String currentInfo = "PackageName==" + intent.getComponent().getPackageName() + ",ClassName==" + intent.getComponent().getClassName();
/**
* 如果找到是launcher,直接continue,后面的appInfos.add操作就不会发生了
*/
if (homeInfo != null) {
if (homeInfo.packageName.equals(
intent.getComponent().getPackageName())
&& homeInfo.name.equals(
intent.getComponent().getClassName())) {
MAX_RECENT_TASKS = MAX_RECENT_TASKS + 1;
continue;
}
}
//设置intent的启动方式为 创建新task()【并不一定会创建】
intent.setFlags((intent.getFlags()&~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
| Intent.FLAG_ACTIVITY_NEW_TASK);
//获取指定应用程序activity的信息(按我的理解是:某一个应用程序的最后一个在前台出现过的activity。)
final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
if (resolveInfo != null) {
final ActivityInfo activityInfo = resolveInfo.activityInfo;
final String title = activityInfo.loadLabel(pm).toString();
Drawable icon = activityInfo.loadIcon(pm);
if (title != null && title.length() > 0 && icon != null) {
singleAppInfo.put("title", title);
singleAppInfo.put("icon", icon);
singleAppInfo.put("tag", intent);
}
}
appInfos.add(singleAppInfo);
}
MAX_RECENT_TASKS = repeatCount;
}
/**
* gridview的适配器
* @author yanbin
*
*/
private class MyAppAdapter implements ListAdapter{
@Override
public void registerDataSetObserver(DataSetObserver observer) {
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
}
@Override
public int getCount() {
return appInfos.size();
}
@Override
public Object getItem(int position) {
return appInfos.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return false;
}
/**
* 自定义view
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater mInflater = LayoutInflater.from(MainActivity.this);
View infoView = mInflater.inflate(R.layout.choose_dialog_detail_info, null);
ImageView mImageView = (ImageView) infoView.findViewById(R.id.app_icon);
TextView mTextView = (TextView) infoView.findViewById(R.id.choose_dialog_detail_tv);
String title = (String) appInfos.get(position).get("title");
Drawable icon = (Drawable) appInfos.get(position).get("icon");
Intent singleIntent = (Intent) appInfos.get(position).get("tag");
infoView.setTag(singleIntent);
mImageView.setImageDrawable(icon);
mTextView.setText(title);
infoView.setOnClickListener(new SingleAppClickListener());
return infoView;
}
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}
}
/**
* 点击应用图标即可启动程序
* @author yanbin
*
*/
private class SingleAppClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Intent intent = (Intent)v.getTag();
if (intent != null) {
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
try {
MainActivity.this.startActivity(intent);
if(mDialog != null)
mDialog.dismiss();
} catch (ActivityNotFoundException e) {
Log.w("Recent", "Unable to launch recent task", e);
}
}
}
}
}
package yanbin.recent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.DataSetObserver;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;
/**
* 弹出最近任务测试
* @author yanbin
*
*/
public class MainActivity extends Activity {
private Dialog mDialog;
private static int MAX_RECENT_TASKS = 12; // allow for some discards
private static int repeatCount = 12;//保证上面两个值相等
//用来存放每一个recentApplication的信息,我们这里存放应用程序名,应用程序图标和intent。
private List<HashMap<String,Object>> appInfos = new ArrayList<HashMap<String, Object>>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
reloadButtons();//程序加载的时候就加载出最近任务
}
public void click(View view){
int id = view.getId();
switch (id) {
case R.id.btn:
generateDialog();
break;
}
}
/**
* 弹出最近任务对话框
*/
public void generateDialog(){
mDialog = new Dialog(this,R.style.dialog);
LayoutInflater mInflater = LayoutInflater.from(this);
View dialogView = mInflater.inflate(R.layout.choose_dialog, null);
final GridView mGridView = (GridView) dialogView.findViewById(R.id.choose_dialog_gridview);
mGridView.setAdapter(new MyAppAdapter());
mDialog.setContentView(dialogView);
mDialog.setCanceledOnTouchOutside(true);
mDialog.show();
}
/**
* 核心方法,加载最近启动的应用程序
* 注意:这里我们取出的最近任务为 MAX_RECENT_TASKS + 1个,因为有可能最近任务中包好Launcher2。
* 这样可以保证我们展示出来的 最近任务 为 MAX_RECENT_TASKS 个
*/
private void reloadButtons() {
//得到包管理器和activity管理器
final Context context = this;
final PackageManager pm = context.getPackageManager();
final ActivityManager am = (ActivityManager)
context.getSystemService(Context.ACTIVITY_SERVICE);
//从ActivityManager中取出用户最近launch过的 MAX_RECENT_TASKS + 1 个,以从早到晚的时间排序,
//注意这个 0x0002,它的值在launcher中是用ActivityManager.RECENT_IGNORE_UNAVAILABLE
//但是这是一个隐藏域,因此我把它的值直接拷贝到这里
final List<ActivityManager.RecentTaskInfo> recentTasks =
am.getRecentTasks(MAX_RECENT_TASKS + 1, 0x0002);
//这个activity的信息是我们的launcher
ActivityInfo homeInfo =
new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)
.resolveActivityInfo(pm, 0);
int numTasks = recentTasks.size();
for (int i = 0; i < numTasks && (i < MAX_RECENT_TASKS); i++) {
HashMap<String, Object> singleAppInfo = new HashMap<String, Object>();//当个启动过的应用程序的信息
final ActivityManager.RecentTaskInfo info = recentTasks.get(i);
Intent intent = new Intent(info.baseIntent);
if (info.origActivity != null) {
intent.setComponent(info.origActivity);
}
//TODO 测试用,无意义代码
String currentInfo = "PackageName==" + intent.getComponent().getPackageName() + ",ClassName==" + intent.getComponent().getClassName();
/**
* 如果找到是launcher,直接continue,后面的appInfos.add操作就不会发生了
*/
if (homeInfo != null) {
if (homeInfo.packageName.equals(
intent.getComponent().getPackageName())
&& homeInfo.name.equals(
intent.getComponent().getClassName())) {
MAX_RECENT_TASKS = MAX_RECENT_TASKS + 1;
continue;
}
}
//设置intent的启动方式为 创建新task()【并不一定会创建】
intent.setFlags((intent.getFlags()&~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
| Intent.FLAG_ACTIVITY_NEW_TASK);
//获取指定应用程序activity的信息(按我的理解是:某一个应用程序的最后一个在前台出现过的activity。)
final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
if (resolveInfo != null) {
final ActivityInfo activityInfo = resolveInfo.activityInfo;
final String title = activityInfo.loadLabel(pm).toString();
Drawable icon = activityInfo.loadIcon(pm);
if (title != null && title.length() > 0 && icon != null) {
singleAppInfo.put("title", title);
singleAppInfo.put("icon", icon);
singleAppInfo.put("tag", intent);
}
}
appInfos.add(singleAppInfo);
}
MAX_RECENT_TASKS = repeatCount;
}
/**
* gridview的适配器
* @author yanbin
*
*/
private class MyAppAdapter implements ListAdapter{
@Override
public void registerDataSetObserver(DataSetObserver observer) {
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
}
@Override
public int getCount() {
return appInfos.size();
}
@Override
public Object getItem(int position) {
return appInfos.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return false;
}
/**
* 自定义view
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater mInflater = LayoutInflater.from(MainActivity.this);
View infoView = mInflater.inflate(R.layout.choose_dialog_detail_info, null);
ImageView mImageView = (ImageView) infoView.findViewById(R.id.app_icon);
TextView mTextView = (TextView) infoView.findViewById(R.id.choose_dialog_detail_tv);
String title = (String) appInfos.get(position).get("title");
Drawable icon = (Drawable) appInfos.get(position).get("icon");
Intent singleIntent = (Intent) appInfos.get(position).get("tag");
infoView.setTag(singleIntent);
mImageView.setImageDrawable(icon);
mTextView.setText(title);
infoView.setOnClickListener(new SingleAppClickListener());
return infoView;
}
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}
}
/**
* 点击应用图标即可启动程序
* @author yanbin
*
*/
private class SingleAppClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Intent intent = (Intent)v.getTag();
if (intent != null) {
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
try {
MainActivity.this.startActivity(intent);
if(mDialog != null)
mDialog.dismiss();
} catch (ActivityNotFoundException e) {
Log.w("Recent", "Unable to launch recent task", e);
}
}
}
}
}
相关文章推荐
- Android 按下home键,程序在后台运行,在launcher里面再点击icon又重新启动了
- 【Android游戏开发十九】(必看篇)SurfaceView运行机制详解—剖析Back与Home按键及切入后台等异常处理!
- android 使程序后台运行
- linux后台运行程序及恢复
- [Android界面] 如何监听android程序进入后台,和恢复到前台???
- Android按返回键退出程序但不销毁,程序后台运行,同QQ退出处理方式
- Qt for Android调用Android接口将程序移到后台/前台运行
- Android原理 不需要关闭后台运行程序
- android 后台进程被强杀 如何在快速切换正确的运行程序
- 实例、运行-Android实现程序前后台切换效果-by小雨
- Android 程序真退出与假退出后台运行详解
- Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
- Android 实现微信,QQ的程序前后台切换:back键切换后台;点击通知栏恢复前台。
- Android监听程序进入后台,或者恢复到前台
- 三十九、Android原理 不需要关闭后台运行程序
- android 创建后台运行的服务程序
- Android 签名打包后的APP在后台运行时按icon导致程序重启的奇葩问题解决
- Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
- Android SurfaceView运行机制详解—剖析Back与Home按键及切入后台等异常处理!
- Android原理 不需要关闭后台运行程序