5

Mam aplikację, która zmienia tapetę użytkowników. Chcę dodać skrót do Androida, aby użytkownik mógł zmienić tapetę bez konieczności pełnego otwierania aplikacji (głównym zastosowaniem jest powiązanie go z gestem w programie Nova Launcher, który pozwala wybrać skrót dla każdego gestu) .Uruchamianie aktywności ze skrótu zawsze uruchamia główną aktywność również

Mam wszystko działa, z jednym ogromnym problemem. Za każdym razem, gdy uruchamiany jest skrót, pojawia się moja niestandardowa akcja, ale następnie rozpoczyna się główna aktywność uruchamiania! To oczywiście nie jest pożądane i nie mogę zrozumieć, co się dzieje.

Oto kod 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); 
} 
} 

Oto moje (uproszczone) manifest:

<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> 

Czy to w ogóle możliwe do zrobienia bez spustu główną działalnością wyrzutnia?

+0

można dodać kod gdzie android.intent.action.CREATE_SHORTCUT jest zwolniony. Może musisz uruchomić aplikację w nowym zadaniu. – nandeesh

+0

Warto to zobaczyć. Co robi uruchomienie go w nowym zadaniu i dlaczego nie byłoby to inne działanie? Aby odpowiedzieć na twoje pytanie, uważam, że mogę dodać tę flagę do intencji, której używam. – RealCasually

+0

@ RealCasually, czy to zostało już rozwiązane? – Droidekas

Odpowiedz

0

Będę tu nieco "filozoficzny". Tak więc, gdy tworzysz skrót, chcesz dotrzeć do aplikacji z ekranu głównego, a nie z menu. Ale to, co chcesz, to uruchomienie innej aktywności po kliknięciu tego "skrótu". Oznacza to, że chcesz mieć ikonę programu uruchamiającego dla innej aktywności. Wspomniano o here, nie miałoby to większego sensu. Zamiast tego, czego szukasz, to widget, który otwiera inną aktywność zgodnie z twoimi potrzebami i może być umieszczony na ekranie. W tym celu Android developer website ma bardzo szczegółowe wyjaśnienie.

EDIT: jak na swój problem, myślę, że dodałeś podobny intent-filtr dla obu działań stąd zarówno dostać launched.Because zamiarem-filtry wskazują, że obaj są działania wyrzutni.

+0

Nie sądzę, że to całkiem dobrze. Chcę mieć skrót na Androida (pojęcie "Shortcut", a nie zwykłe słowo), aby użytkownicy aplikacji, takich jak Nova Launcher i Tasker, mogli go używać do wykonywania funkcji bez oglądania jakiegokolwiek interfejsu użytkownika. – RealCasually

+0

Ale w jaki sposób użytkownik uzyskałby ten skrót? Czy to przeciągnięcie i upuszczenie z menu aplikacji? – Droidekas

+0

Przepraszam, właśnie wymyśliłem twój przypadek użycia. To źle. – Droidekas

1

Spróbuj, wykonując następujące zmiany.

metoda 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) deklaracja w pliku manifestu:

<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> 

Mam nadzieję, że będzie pomocny !!

+0

Obawiam się, że to nie pomogło. Po pierwsze, nie wywołując setResult, skrót nie pojawi się w ogóle. Kiedy to zrobię, pojawia się skrót, ale znowu pojawia się ten sam problem z głównym działaniem. W każdym razie dzięki. – RealCasually

0

Witam RealRealCasually,

Chyba po prostu trzeba usunąć kategorii linii z oczywistego kodu.

Po prostu usuń: <category android:name="android.intent.category.DEFAULT" /> z kodu manifestu.

Proszę sprawdzić zaakceptowaną odpowiedź here.

Mam nadzieję, że ci to pomoże. Proszę dać mi znać, jeśli to nie rozwiązuje problemu.

Ciesz Coding ... :)

1

Więc Przetestowałem to z nova launcher i wydaje się, że działa poprawnie.

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> 

rzeczy, o których dowiedział się -the kategoria jest tylko tekst, który można zmienić według swojej woli

mogę uruchomić MainActivity2 od skrótu utworzonego z Nova Launcher.

Po uruchomieniu aplikacji z szuflady aplikacji otwiera się MainActivity1.

Możliwa Problem: jeśli otworzysz aplikację ze skrótu, a zminimalizować aplikację, aplikacja zostanie wznowione od aktywności 2.

Punkt istota może wolisz skrótu mechanizm podejmowania jakbyś are.And jeśli jest to to samo podejście/kod, którego używasz. Ponownie jestem zaskoczony.

6

Zdarzyło mi się również. Jednak znalazłem działające rozwiązanie. Po prostu dodaj android:launchMode="singleInstance" do aktywności otwieranej ze swojego skrótu.

W tym przypadku:

<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> 

nie mogę znaleźć wyjaśnienie tego, bo naprawdę nie mogę znaleźć korzeń problemu. To po prostu działa

Źródło: https://stackoverflow.com/a/23002294/1354096

+0

To wydaje się robić dokładnie to, czego potrzebowałem. Działanie skrótu nie powoduje już otwarcia głównego działania, nawet jeśli zostało wcześniej zminimalizowane. Dziękuję Ci. – Waboodoo

Powiązane problemy