Rozpoczęcie aktywności wymienionej w „Ustawieniach” z terminala (lub powłoki adb)

13

Chciałbym rozpocząć tę aktywność od terminala: com.android.settings.Settings$PowerUsageSummaryActivity

próbowałem

am start -S com.android.settings/.Settings$PowerUsageSummaryActivity

i to właśnie otrzymuję:

Stopping: com.android.settings
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.settings/.Settings }

Problem polega na tym, że am startpolecenie pomija$PowerUsageSummaryActivityczęść, więc po prostu otwieram standardowe menu „Ustawienia”. Jak mogę otworzyć tę konkretną stronę „Podsumowanie zużycia energii” z terminala?

juniecho
źródło
2
Czy próbowałeś umieścić go w pojedynczych cudzysłowach, tj. 'com.android.settings/.Settings$PowerUsageSummaryActivity'- lub uciec od $podobnych com.android.settings/.Settings\$PowerUsageSummaryActivity- co zwykle robi się w powłoce, gdy mamy do czynienia z dosłownymi $znakami nie wskazującymi zmiennej?
Izzy
Co powiesz na otwarte działanie RunLog Taskera na wierzchu z terminala? Tasker ma menu z trzema kropkami, aby otworzyć okno dziennika.
Nicola Al.

Odpowiedzi:

12

Jak napisałem w moim komentarzu, niektóre znaki specjalne wymagają szczególnej uwagi podczas pracy z poleceniami powłoki (lub skryptami powłoki). Jednym z nich jest $znak, który zwykle wskazuje zmienną. Jeśli należy to potraktować dosłownie, musisz go uciec (lub zawrzeć cały ciąg pojedynczymi cudzysłowami). Podobne zasady dotyczące znaków cudzysłowu.

Jak powinno wyglądać twoje polecenie z ucieczką $ , możesz już znaleźć odpowiedź Eldarerathisa :

shell@android:/ # am start -n com.android.settings/.Settings\$PowerUsageSummaryActivity

Zwróć uwagę na „ukośnik wsteczny” przed $- to znak ucieczki. Użyj tego samego dla znaków cudzysłowu lub spacji, jeśli twoje polecenie zawiera niektóre, które należy wziąć dosłownie, np

myscript.sh first\ parameter\!
myscript.sh "first parameter!"

oba zrobiłyby to samo: uczynienie z łańcucha pojedynczego parametru. W przykładzie twojego am startpolecenia, tak się stało podczas analizowania:

  • Komenda: am
  • parametr 1: start
  • parametr 2: -S
  • parametr 3: com.android.settings/.Settings$PowerUsageSummaryActivity
    • ma $, interpretacja: zmienna $PowerUsageSummaryActivitynie jest ustawiona, więc pusta
    • wniosek: parametr 3 to com.android.settings/.Settings

Zauważ też, że jeśli uruchomisz to bezpośrednio za pomocą adb shell, polecenie przejdzie dwukrotnie analizę płaszcza, więc musisz uciec lub zacytować polecenie ponownie , tak jak poniżej:

user@desktop:~$ adb shell am start -n 'com.android.settings/.Settings\$PowerUsageSummaryActivity'
Izzy
źródło
Oh dziękuję! och, jak mogłem zapomnieć o ucieczce $ ... jestem należycie zawstydzony :)
juniecho
Małe rzeczy w życiu ... Łatwo przeoczyć :) Btw: Jeśli to rozwiązało problem, rozważ oznaczenie jednej z odpowiedzi jako „zaakceptowane” (klikając znacznik wyboru obok) [i oceń drugą :)] - więc inne osoby wpadają w podobną pułapkę :)
Izzy
oh znalazłem znacznik wyboru. więc w ten sposób akceptuję odpowiedź ... dzięki, że pierwszy raz używam
stackexchange
Zapraszamy w każdej chwili :) Teraz widzisz, jak dobrze tutaj działa: rozpowszechnij wiadomość :)
Izzy
3
Z bash, w moim przypadku, tylko to działało: adb shell 'am start -n com.android.settings/.Settings\$PowerUsageSummaryActivity'. Nie wiem dlaczego.
Firelord
5

Escape the $w nazwie podklasy i powinno działać:

shell@android:/ # am start -S com.android.settings/.Settings\$PowerUsageSummaryActivity
Starting: Intent { cmp=com.android.settings/.Settings$PowerUsageSummaryActivity }
shell@android:/ #

Inną opcją jest wysłanie zamiaru, który nasłuchuje na ekranie Zużycie energii:

shell@android:/ # am start -a android.intent.action.POWER_USAGE_SUMMARY

Możesz znaleźć zamiary, patrząc na <action>znaczniki w pliku AndroidManifest.xml dla „aplikacji” Ustawienia (którą można wyświetlić na GitHub ). Jako przykład, oto definicja działania dla Settings$PowerUsageSummaryActivity:

<activity android:name="Settings$PowerUsageSummaryActivity"
        android:label="@string/power_usage_summary_title"
        android:uiOptions="none"
        android:taskAffinity=""
        android:excludeFromRecents="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <action android:name="android.intent.action.POWER_USAGE_SUMMARY" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="com.android.settings.SHORTCUT" />
    </intent-filter>
    <!-- Some other stuff here... -->
</activity>
eldarerathis
źródło