从快捷方式启动活动也始终启动主要活动

时间:2015-01-30 03:26:02

标签: android android-intent android-activity android-manifest

我已经构建了一个更改用户壁纸的应用程序。我希望添加一个Android快捷方式,这样用户就可以更改自己的壁纸而无需完全打开应用程序(主要用例是将其绑定到Nova Launcher之类的手势,允许您为每个手势选择快捷方式)

我有一切工作,有一个大问题。每次触发快捷方式时,我的自定义操作都会发生,但主启动活动也会启动!这显然是不可取的,我无法弄清楚发生了什么。

以下是ShortcutActivity代码:

public class ShortcutActivity extends Activity {

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

    final Intent intent = getIntent();
    final String action = intent.getAction();

    if (Intent.ACTION_CREATE_SHORTCUT.equals(action)) {
        setupShortcut();
        finish();
        return;
    } else {
        Toast.makeText(this, "Do something interesting.", Toast.LENGTH_SHORT).show();
        finish();
    }
}

void setupShortcut() {
    Intent shortcutIntent = new Intent("CHANGE");
    shortcutIntent.setClass(this, getClass());

    Intent intent = new Intent();
    intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.shortcut_title));
    intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);

    Parcelable iconResource = Intent.ShortcutIconResource.fromContext(this, R.drawable.ic_launcher);
    intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);

    setResult(RESULT_OK, intent);
}
}

这是我的(简化)清单:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/title_activity"
    android:theme="@style/AppTheme">
    <activity
        android:name=".WallpaperSettings"
        android:label="@string/title_activity_wallpaper_settings">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".ShortcutActivity"
        android:theme="@android:style/Theme.NoDisplay"
        android:label="@string/shortcut_title">
        <intent-filter>
            <action android:name="android.intent.action.CREATE_SHORTCUT" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

这是否可以在不触发主启动器活动的情况下进行?

5 个答案:

答案 0 :(得分:6)

它也发生在我身上。但是我找到了一个有效的解决方只需将android:launchMode="singleInstance"添加到从快捷方式打开的活动中即可。

在这种情况下:

<activity
    android:name=".MainActivity2"
    android:label="@string/title_activity_main_activity2" >
    <intent-filter>
        <action android:name="android.intent.action.CREATE_SHORTCUT"/>
        <category android:name="android.intent.category.CUSTOM_TEST" />
    </intent-filter>
</activity>

我无法找到对此的解释,因为无法找到问题根。它只是工作

来源:https://stackoverflow.com/a/23002294/1354096

答案 1 :(得分:1)

通过执行以下更改尝试一下。

1)setupShortcut方法:

private void setupShortcut() {
Intent shortcutIntent = new Intent(getApplicationContext(),
        ShortcutActivity .class);

shortcutIntent.setAction(Intent.ACTION_VIEW);

Intent addIntent = new Intent();
addIntent
        .putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.shortcut_title));
addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
        Intent.ShortcutIconResource.fromContext(getApplicationContext(),
                R.drawable.ic_launcher));

addIntent
        .setAction("com.android.launcher.action.INSTALL_SHORTCUT");
getApplicationContext().sendBroadcast(addIntent);
}

2)清单文件中的声明:

 <activity
    android:name=".ShortcutActivity"

        android:noHistory="true"
        android:excludeFromRecents="true"      

    android:theme="@android:style/Theme.NoDisplay"
    android:label="@string/shortcut_title">
    <intent-filter>
        <action android:name="android.intent.action.CREATE_SHORTCUT" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

我希望它会有所帮助!!

答案 2 :(得分:1)

所以我用nova发射器对它进行了测试,看起来效果很好。

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.geronimo.testapplciation" >

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".MainActivity2"
        android:label="@string/title_activity_main_activity2" >
        <intent-filter>
            <action android:name="android.intent.action.CREATE_SHORTCUT"/>
            <category android:name="android.intent.category.CUSTOM_TEST" />
        </intent-filter>
    </activity>
</application>

我学到的东西 - 该类别只是您可以根据自己的意愿更改的文本

我可以从Nova Launcher创建的快捷方式中启动MainActivity2

如果我从应用程序抽屉启动应用程序,则会打开MainActivity1。

可能的问题:如果您从快捷方式打开应用程序并最小化应用程序,则应用程序将从活动2恢复。

重点是,您可能更喜欢自己的快捷方式制作机制。如果这是您正在使用的相同方法/代码。再次感到难过。

答案 3 :(得分:0)

我会走一点&#34;哲学&#34;因此,当您创建快捷方式时,您要做的是从主屏幕而不是菜单到达应用程序。 但你想要的是在那个&#34;快捷方式&#34;点击。这意味着你想要一个其他活动的启动器图标。如上所述here,这没有多大意义。 相反,您正在寻找的是一个小部件,可以根据您的需要打开另一个活动,并可以放在屏幕上。为此,Android developer website有一个非常详细的解释。

编辑:至于你的问题,我认为你会为这两个活动添加一个类似的intent-filter,因此它们都会被启动。因为intent-filters表明它们都是启动器活动。

答案 4 :(得分:0)

你好RealRealCasually,

我猜您只需要从清单代码中删除类别行。

只需从您的清单代码中移除<category android:name="android.intent.category.DEFAULT" />

请检查已接受的答案here

希望它会对你有所帮助。 如果不能解决您的问题,请与我们联系。

享受编码......:)