เปิดแอปพลิเคชัน Android โดยไม่มีกิจกรรมหลักและเริ่มบริการเมื่อเปิดแอปพลิเคชัน


91

ฉันมีสถานการณ์ต่อไปนี้ในแอปพลิเคชันของฉัน ไม่มี UI ในแอปพลิเคชันของฉัน แทนที่จะเป็นบริการที่เริ่มต้นในการบูตเครื่องและจะทำงานอย่างต่อเนื่อง

ฉันจะกำหนดค่าไฟล์รายการโดยไม่มีกิจกรรมหลักได้อย่างไร ฉันสามารถเปิดแอปโดยไม่มีกิจกรรมได้หรือไม่? และเมื่อเปิดตัวแอปบริการของฉันควรเริ่มต้น เป็นไปได้หรือไม่

ฉันไม่ต้องการสร้างกิจกรรมโปร่งแสงเพื่อเริ่มใช้บริการ


ดู [คำถาม] [1] [1]: stackoverflow.com/questions/4468006/…
Munish Kapoor

คำตอบ:


125

คุณบอกว่าคุณไม่ต้องการใช้กิจกรรมโปร่งแสง แต่ดูเหมือนว่าจะเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้:

  1. ใน Manifest Theme.Translucent.NoTitleBarของคุณตั้งค่ากิจกรรมชุดรูปแบบเพื่อ
  2. setContentView()ไม่รำคาญกับรูปแบบสำหรับกิจกรรมของคุณและจะไม่เรียก
  3. ในกิจกรรมของคุณเริ่มต้นบริการของคุณด้วยonCreate()startService()
  4. ออกจากกิจกรรมfinish()เมื่อคุณเริ่มใช้บริการ

กล่าวอีกนัยหนึ่งกิจกรรมของคุณไม่จำเป็นต้องมองเห็นได้ เพียงแค่ตรวจสอบให้แน่ใจว่าบริการของคุณกำลังทำงานจากนั้นออกซึ่งดูเหมือนว่าคุณต้องการ

ฉันขอแนะนำเป็นอย่างยิ่งให้แสดงการแจ้งเตือน Toastอย่างน้อยซึ่งระบุให้ผู้ใช้ทราบว่าคุณกำลังเปิดใช้บริการหรือกำลังทำงานอยู่ เป็นประสบการณ์ของผู้ใช้ที่แย่มากที่มีไอคอนตัวเรียกใช้งานที่ดูเหมือนจะไม่ทำอะไรเลยเมื่อคุณกด


2
มันทำให้ฉันมีหน้าจอว่างเปล่าหลังจากเปิดแอปพลิเคชันของฉันซึ่ง shd ไม่เป็นเช่นนั้น ...
Meher

1
@ meher ฉันเพิ่งทดสอบและทำงานได้ดีสำหรับฉัน - บริการของฉันเริ่มต้นขึ้นและฉันไม่เห็นกิจกรรมใด ๆ เลยแม้แต่ชั่วขณะ โปรดโพสต์เนื้อหาใน onCreate () ของกิจกรรมของคุณและเราจะสามารถหาข้อผิดพลาดได้
Darshan Rivka Whittle

เมื่อฉันติดตั้งแอปพลิเคชันของฉันเป็นครั้งแรกฉันสามารถเห็นกิจกรรมเริ่มต้นและหายไปในไม่กี่วินาที
Meher

ชั้นเรียนสาธารณะ TestActivity ขยายกิจกรรม {/ ** เรียกเมื่อสร้างกิจกรรมครั้งแรก * / @Override โมฆะสาธารณะ onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); Log.i ("กิจกรรม", "บริการเริ่มต้น"); startService (Intent ใหม่ (TestActivity.this, MyService.class)); เสร็จสิ้น(); }}
Meher

1
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ดูเหมือนจะไม่ทำงานอีกต่อไป การเปลี่ยนธีมกิจกรรมหลักเป็น Theme.Translucent.NoTitleBar หรือ Theme.Translucent.NoTitleBar.FullScreen ทำให้แอปพลิเคชันที่ทำงานอย่างอื่นแสดงหน้าจอกิจกรรมเป็นเวลาสั้น ๆ ซึ่งทำให้เกิดข้อความ "แอปพลิเคชันหยุดตอบสนอง" อยู่เสมอ
alzee

33

ใช่คุณสามารถทำได้โดยเพียงแค่สร้างสิ่งBroadcastReceiverที่เรียกคุณServiceเมื่อแอปพลิเคชันของคุณบูท นี่คือคำตอบที่สมบูรณ์ที่ฉันได้รับ
Android - เริ่มบริการเมื่อบูต

หากคุณไม่ต้องการไอคอน / ตัวเรียกใช้งานใด ๆ สำหรับแอปพลิเคชันของคุณคุณสามารถทำได้เช่นกันอย่าสร้างกิจกรรมใด ๆ ด้วย

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

เพียงแค่ประกาศของคุณServiceตามที่ประกาศตามปกติ


2
ดูเหมือนว่าผู้ถามจะทำได้ดีในการเริ่มต้นการServiceบูต แต่ต้องการทราบวิธีการไม่มีหลักActivityแต่เพียงตรวจสอบให้แน่ใจว่าServiceกำลังทำงานเมื่อกดไอคอนตัวเรียกใช้งาน
Darshan Rivka Whittle

2
แต่ดูเหมือนว่าพวกเขาต้องการไอคอนตัวเรียกใช้งานซึ่งเมื่อกดแล้วจะทำให้มั่นใจได้ว่าบริการกำลังทำงานอยู่ คำแนะนำของคุณเพียงแค่กำจัดไอคอนตัวเรียกใช้งาน
Darshan Rivka Whittle

@LalitPoptani วิธีแก้ปัญหาก็ใช้ได้ แต่บริการของฉันจะไม่เริ่มทำงานจนกว่าฉันจะบูตโทรศัพท์
Meher

4
ฉันไม่สามารถเริ่มแอปโดยไม่มี MAIN, LAUNCHER ใน AndroidMenifest.xml ยกเว้น SyncAdapter คำตอบของคุณเป็นจริงหรือไม่?
sunghun

1
ฉันได้ลบตัวกรองความตั้งใจพร้อมแท็กการกระทำและหมวดหมู่ ตอนนี้แอปไม่ทำงานในสตูดิโอ Android อีกต่อไป
Nauman Ash

12

เหตุผลในการสร้างแอปโดยไม่มีกิจกรรมหรือบริการอาจเป็นการสร้างแอปวิดเจ็ตหน้าจอหลักที่ไม่จำเป็นต้องเริ่มต้น
เมื่อคุณเริ่มโครงการอย่าสร้างกิจกรรมใด ๆ หลังจากที่คุณสร้างโปรเจ็กต์แล้วให้กดรัน Android No default activity foundสตูดิโอจะบอกว่า

คลิกแก้ไขการกำหนดค่า (จากการเรียกใช้เมนู) และตัวเลือกการเปิดตัวส่วนกำหนดเปิดตัวมูลค่าให้กับไม่มีอะไร จากนั้นคลิกตกลงและเรียกใช้แอพ

( เนื่องจากไม่มีกิจกรรมตัวเรียกใช้งานจะไม่มีแอปปรากฏในเมนูแอป )


2
ขอบคุณนั่นคือกรณีของฉัน ในกรณีที่คุณไม่เห็นแก้ไขการกำหนดค่าเหมือนที่ผมไม่เลือกRun> Run ...จากเมนูหลักแล้วเลือกแก้ไขการตั้งค่า ...
_

6

Android Studio เวอร์ชัน 2.3.2

คุณสามารถสร้างบริการโดยไม่ต้องมีกิจกรรมหลักได้โดยทำตามขั้นตอนง่ายๆ คุณจะสามารถติดตั้งแอปนี้ผ่าน Android Studio และแก้ไขจุดบกพร่องได้เหมือนแอปทั่วไป

ขั้นแรกให้สร้างโครงการใน Android Studio โดยไม่มีกิจกรรม จากนั้นสร้างคลาสบริการของคุณและเพิ่มบริการลงใน AndroidManifest.xml ของคุณ

<application android:allowBackup="true"
    android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <service android:name="com.whatever.myservice.MyService">
        <intent-filter>
            <action android:name="com.whatever.myservice.MyService" />
        </intent-filter>
    </service>
</application>

ตอนนี้ในเมนูแบบเลื่อนลงถัดจากปุ่ม "Run" (ลูกศรสีเขียว) ไปที่ "แก้ไขการกำหนดค่า" และภายใน "Launch Options" ให้เลือก "Nothing" วิธีนี้จะช่วยให้คุณสามารถติดตั้งบริการได้โดยที่ Android Studio ไม่บ่นว่าไม่มีกิจกรรมหลัก

เมื่อติดตั้งแล้วบริการจะไม่ทำงาน แต่คุณจะสามารถเริ่มได้ด้วยคำสั่ง adb shell ...

am startservice -n com.whatever.myservice/.MyService

สามารถตรวจสอบว่ามันทำงานด้วย ...

ps | grep whatever

ฉันยังไม่ได้ลอง แต่คุณอาจให้ Android Studio เริ่มบริการโดยอัตโนมัติได้เช่นกัน ซึ่งจะทำได้ในเมนู "แก้ไขการกำหนดค่า"


ฉันได้รับข้อผิดพลาดต่อไปนี้จากเชลล์ adb: เริ่มต้นบริการ: Intent {cmp = com.example.wolk.myapp / .MyIntentService} ข้อผิดพลาด: ไม่พบ; ไม่มีการเริ่มบริการ LOGCAT แสดง: ActivityManager: ไม่อนุญาตให้เริ่ม ServiceInfo {274d8af com.example.wolk.myapp.MyIntentService
Trismegistos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.