android后台服务没有应答

iqxoj9l9  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(327)

我试图创建一个没有用户界面的后台服务,我用 BroadcastReceiver 在清单文件里添加了我需要的东西。然后我没有配置任何链接中所写的内容。我在android仿真器上测试,当我执行我的应用程序时,什么都没有发生,服务也没有启动。我的问题在哪里?
这是我的名单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.myapplication22">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication22">

        <service android:name=".MyService" />

        <receiver
            android:name=".StartReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

这是我的收音机

override fun onReceive(context: Context, intent: Intent) {
    Log.i("MYSERVICE","override fun onReceive(context: Context, intent: Intent)")
    if (intent.action == Intent.ACTION_BOOT_COMPLETED ) {
        Intent(context, MyService::class.java).also {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context.startService(it)

                return
            }
            context.startService(it)
        }
    }
}

这是我的服务

class MyService : Service() {

    override fun onBind(intent: Intent): IBinder? {
        return null
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        if (intent != null) {
            println("MYSERVICE STARTED AUTOMATICALLY")
        }
        return START_STICKY
    }

    override fun onCreate() {
        super.onCreate()
        println("MYSERVICE override fun onCreate() {")

    }

    override fun onDestroy() {
        super.onDestroy()
        println("MYSERVICE override fun onDestroy() {")

    }
}
wz1wpwve

wz1wpwve1#

你的 Service 只有在 BOOT_COMPLETED 操作将被接收,所以只有当应用程序已经安装和系统重新启动。当您通过adb安装应用程序时,它不会启动(因为您配置为在安装时不启动任何程序)
做一些 Activity 完全透明 startServiceonCreate 就在那之后 finish() 打电话。包括 <activity 舱单上的声明,但没有任何 <intent-filter . 然后,在安装应用程序时,选择指定的活动并指向这个透明的活动,而不是什么都不运行 Service 然后就辞职了。没有
intent-filter Activity 在启动程序中不可见,启动它的唯一方法是在as中进行配置
当你将你的应用程序发送给最终用户,然后删除 <activity 声明没有实际的方法来运行这个透明的 Activity . 仅限 Service 在当前情况下,只能在系统启动时启动
顺便说一句,你的nothing链接假设你的应用程序将属于系统,移动到系统分区/文件夹。你有这样的特权吗(在通常的用户设备上,这是不可能的,您需要root权限)没有所有的红色标记行 <application 标签不起作用
编辑:
第一步:
创建文件 res/values/styles.xml 在下面加上过去的或现在已经加上的 <style 标签

<resources>
  <style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
  </style>
</resources>

第二步:新建 Activity 并以上述方式在清单中声明

<activity android:name=".YourActivity" android:theme="@style/Theme.Transparent"/>

如果你在下面加上 <intent-filter<activity 然后标记这个 Activity 显示在系统用户界面(启动器),所以不要这样做,放在这里只是为了通知

// launcher icon declaration, not for OPs case
<intent-filter>
    <category android:name="android.intent.category.LAUNCHER"/>
    <action android:name="android.intent.action.MAIN"/>
    // MAIN must be placed with first LAUNCHER declaration
</intent-filter>

请注意,您还可以创建多个 <activity 带的标记 LAUNCHER 声明(第二次和更进一步 MAIN 标签),使你的应用程序显示多个图标,每个图标一个
Activity LAUNCHER -声明(据我所知,您还可以更改它们的名称和图标)
第三步:内部 onCreate 就在之后 super.onCreate 打电话开始你的工作 Service 然后退出这个无形的 Activity ```
startService(this, MyService.class); // will start service
finish(); // quits activity

第四步:在 `Edit Configurations...` 与其什么都不做,不如随便挑 `Specified Activity` 

相关问题