การเริ่มกิจกรรมที่อยู่ในรายการ“ การตั้งค่า” จากเทอร์มินัล (หรือเชลล์ adb)


13

ฉันต้องการเริ่มกิจกรรมนี้จากเทอร์มินัล: com.android.settings.Settings$PowerUsageSummaryActivity

ฉันเหนื่อย

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

และนี่คือสิ่งที่ฉันได้รับ:

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

ปัญหาคือam startคำสั่งละเว้น$PowerUsageSummaryActivityส่วนหนึ่งดังนั้นโดยทั่วไปฉันแค่ได้รับมาตรฐาน "ตั้งค่า" เปิดเมนู ฉันจะเปิดหน้า "สรุปการใช้พลังงาน" เฉพาะนั้นได้อย่างไรจากเทอร์มินัล


2
มีคุณพยายามใส่ลงในราคาเดียวคือ'com.android.settings/.Settings$PowerUsageSummaryActivity'- หรือการหลบ$เหมือนcom.android.settings/.Settings\$PowerUsageSummaryActivity- ซึ่งเป็นสิ่งที่ปกติจะทำในเปลือกเมื่อจัดการกับตัวอักษร$สัญญาณไม่ได้บ่งชี้ตัวแปร?
Izzy

แล้วกิจกรรม RunLog ของ Tasker ที่เปิดอยู่ด้านบนสุดจาก terminal ทาซเคอร์มีเมนู 3 จุดเพื่อเปิดหน้าต่างบันทึก
Nicola Al

คำตอบ:


12

ตามที่ฉันเขียนในความคิดเห็นของฉันมีอักขระพิเศษบางอย่างที่ต้องการการดูแลเป็นพิเศษเมื่อทำงานที่ shell prompt (หรือในเชลล์สคริปต์) หนึ่งในนั้นคือ$เครื่องหมายซึ่งโดยปกติจะระบุตัวแปร หากควรดำเนินการอย่างแท้จริงคุณจะต้องหลบหนีมัน (หรือล้อมรอบสตริงทั้งหมดด้วยคำพูดเดียว) กฎที่คล้ายกันสำหรับเครื่องหมายคำพูด

ลักษณะที่คำสั่งของคุณควรมีลักษณะเหมือนกับการหลบหนี $คุณสามารถหาคำตอบของ eldarerathisได้แล้ว:

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

สังเกตว่า "แบ็กสแลช" ด้านหน้า$- นั่นคือสัญญาณการหลบหนี ใช้แบบเดียวกันสำหรับเครื่องหมายคำพูดหรือช่องว่างถ้าคำสั่งของคุณมีบางอย่างที่จะต้องดำเนินการอย่างแท้จริงเช่น

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

ทั้งสองจะทำแบบเดียวกัน: การทำให้สตริงเป็นพารามิเตอร์เดียว ในตัวอย่างของam startคำสั่งของคุณนี่คือสิ่งที่เกิดขึ้นกับการแยกวิเคราะห์:

  • คำสั่ง: am
  • พารามิเตอร์ 1: start
  • พารามิเตอร์ 2: -S
  • พารามิเตอร์ 3: com.android.settings/.Settings$PowerUsageSummaryActivity
    • มี a $, การตีความ: $PowerUsageSummaryActivityไม่ได้ตั้งค่าตัวแปรว่างเปล่า
    • ข้อสรุป: พารามิเตอร์ 3 คือ com.android.settings/.Settings

โปรดทราบว่าหากคุณเรียกใช้งานโดยตรงผ่านadb shellคำสั่งจะผ่านการแยกวิเคราะห์เชลล์สองครั้งดังนั้นคุณต้องหลีกเลี่ยงหรืออ้างอิงคำสั่งอีกครั้งเช่นนี้

user@desktop:~$ adb shell am start -n 'com.android.settings/.Settings\$PowerUsageSummaryActivity'

โอ้ขอบคุณ! โอ้ฉันจะลืมเหรียญได้อย่างไร ... ฉันอายอย่างแน่นอน :)
Juniecho

สิ่งเล็ก ๆ น้อย ๆ ในชีวิต ... มองข้ามไปได้ง่าย :) Btw: ถ้านั่นช่วยแก้ปัญหาของคุณให้ลองทำเครื่องหมายคำตอบหนึ่งในคำตอบว่า "ยอมรับ" (คลิกที่เครื่องหมายถูกถัดจากมัน) [และเพิ่มอีก :)] ก็เป็นที่ชัดเจนกับคนอื่น ๆ แตะเป็นกับดักที่คล้ายกัน :)
อิซซี่

โอ้ฉันพบเครื่องหมายถูก ดังนั้นนี่คือวิธีที่ฉันยอมรับคำตอบ ... ขอบคุณนี่เป็นครั้งแรกที่ฉันใช้ stackexchange;)
juniecho

คุณยินดีต้อนรับทุกที่ทุกเวลา :) ตอนนี้คุณจะเห็นว่ามันทำงานได้ดีแค่ไหน: กระจายคำ :)
อิซซี

3
adb shell 'am start -n com.android.settings/.Settings\$PowerUsageSummaryActivity'ด้วยการทุบตีในกรณีของฉันเพียงแค่นี้ทำงาน: ไม่รู้ทำไม
Firelord

5

หลีกเลี่ยง$ในชื่อคลาสย่อยและควรทำงาน:

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

ตัวเลือกอื่นคือส่งความตั้งใจที่หน้าจอการใช้พลังงานแทนฟัง:

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

คุณสามารถค้นหาความตั้งใจได้โดยดูที่<action>แท็กในไฟล์ AndroidManifest.xml สำหรับการตั้งค่า "แอปพลิเคชัน" (ซึ่งสามารถดูได้บน GitHub ) ตัวอย่างเช่นต่อไปนี้เป็นคำจำกัดความของกิจกรรมสำหรับ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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.