如何创建主屏幕快捷方式以恢复顶级活动

时间:2013-06-12 06:02:35

标签: android android-intent

我有一个litlte代码,可以在第一次运行时为主屏幕添加快捷方式:

    Intent shortcutIntent = new Intent(getApplicationContext(),
            SFlashActivity.class);

    shortcutIntent.setAction(Intent.ACTION_MAIN);

    Intent addIntent = new Intent();
    addIntent
            .putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "New App");
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
            Intent.ShortcutIconResource.fromContext(getApplicationContext(),
                    R.drawable.ic_launcher));

    addIntent
            .setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    addIntent
            .putExtra("duplicate", false);
    getApplicationContext().sendBroadcast(addIntent);

但是使用上面的代码,我的应用程序始终启动Splash屏幕,而我的应用程序正在运行。 那我怎么能让主屏幕快捷方式恢复到顶级活动。 我注意到,谷歌播放安装时应用程序的快捷方式总是恢复顶级活动。

非常感谢!

3 个答案:

答案 0 :(得分:2)

使用isTaskRoot()方法 在主活动的OnCreate()中输入以下代码段 这是一个例子:


 @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        setContentView(R.layout.splashscreen);              
        if(!isTaskRoot()){
            finish();
            return; 
        }
 }

找到解决方案here

答案 1 :(得分:1)

当通过主屏幕上的图标启动时,Android将始终使用android.intent.action.MAIN中的AndroidManifest.xml过滤器启动活动,除非应用程序已在运行(在这种情况下,它显然会恢复活动)在堆栈顶部。)

要实现您所描述的内容,您只需将最后一个可见活动存储在SharedPreferences中,并根据首选项启动 Dispatcher 活动即可启动上一个活动。

因此,如果prefs中存在活动,则启动该活动或启动SplashScreen。

在您想要自动重新启动的每项活动中:

@Override
protected void onPause() {
    super.onPause();

    SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
    Editor editor = prefs.edit();
    editor.putString("lastActivity", getClass().getName());
    editor.commit();
}

Dispatcher 活动类似于以下内容:

public class Dispatcher extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Class<?> activityClass;

        try {
            SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
            activityClass = Class.forName(
                prefs.getString("lastActivity", SplashScreen.class.getName()));
        } catch(ClassNotFoundException ex) {
            activityClass = SplashScreen.class;
        }


        startActivity(new Intent(this, activityClass));
    }
}

说明

  • 您可以为onPause覆盖
  • 创建基类
  • Dispatcher 活动显然需要android.intent.action.MAIN行动

参考: - How to make an android app return to the last open activity when relaunched?

答案 2 :(得分:0)

由于按下主页按钮,我在应用程序处于后台时回来时也遇到了恢复应用程序的相同问题,

要完成的两项更改

1.将以下属性添加到清单文件中的活动

android:alwaysRetainTaskState="true" 

这将从启动器图标开始时恢复活动。

2.如果您单击主页屏幕上以编程方式创建的应用程序图标,则更改不会恢复应用程序。因为您已为启动目的指定了“SFlashActivity.class”。为了克服这个问题,你必须做一个技巧,如下所示:

将此功能添加到SFlashActivity.class

public boolean CheckIfAppIsResumable(){
    try{
         ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
         List<RunningTaskInfo> runningTaskInfoList =  am.getRunningTasks(1);
         Iterator<RunningTaskInfo> itr = runningTaskInfoList.iterator();
         while(itr.hasNext()){
             RunningTaskInfo runningTaskInfo = (RunningTaskInfo)itr.next();
             CharSequence desc= runningTaskInfo.description;
             int numOfActivities = runningTaskInfo.numActivities;
             int numRunning=runningTaskInfo.numRunning;
             String topActivity = runningTaskInfo.topActivity.getClassName();
             Log.d("description", ""+desc);
             Log.d("numActivities", ""+numOfActivities);
             Log.d("numRunning", ""+numRunning);
             Log.d("topActivity", ""+topActivity);
             if(numRunning>1 && topActivity.equalsIgnoreCase("com.yourpackage.yoursplashclass"))
                 return true;
         }
         return false;
    }
    catch(Exception e){
        Log.d("Errror CheckIsAppIsResumable=", ""+e.getMessage());
        return false;
    }
}

在Oncreate中:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    if(CheckIfAppIsResumable()){
        finish();
        return;//will finish the new started splash activity
    }

如果您的快捷方式意图没有标志FLAG_ACTIVITY_CLEAR_TOP。