首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >保持相互调用服务/广播

保持相互调用服务/广播
EN

Stack Overflow用户
提问于 2018-05-30 06:42:17
回答 1查看 42关注 0票数 -2

我正在构建一个简单的应用程序,它不断监测媒体水平,并将其调整为20%的最大水平的所有时间,如果用户增加,它应该回到20%。

我遵循的概念是通过服务进行监控过程,一旦该服务被破坏,它将调用广播接收器,该接收器反过来再次调用接收器,依此类推,作为无限循环,但在下面的代码中看起来有问题,所以它不能按预期工作,并且服务/广播不会一直调用彼此!

我以如下方式启动了mainActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val audio = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager
        val level = audio.getStreamVolume(AudioManager.STREAM_MUSIC)

        val maxVolume = audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
        val percent = 0.2f
        val twintyVolume = (maxVolume * percent).toInt()

        if ( level > twintyVolume) {
            Toast.makeText(this,"audio level is $level", Toast.LENGTH_LONG).show()
            audio.setStreamVolume(AudioManager.STREAM_MUSIC,twintyVolume,0)
        }

        this.startService(Intent(this, VolumeCheck::class.java))
    }
}

上面进行了初步检查,并将媒体音量减少到最大音量的20%,然后启动服务,该服务使用以下代码执行相同的操作:

class VolumeCheck : Service() {

    private lateinit var context: Context

    override fun onCreate() {
        super.onCreate()
        context = this
        Toast.makeText(this, "service created", Toast.LENGTH_SHORT).show();
    }

    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        super.onStartCommand(intent, flags, startId)
        Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();

        val audio = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
        val mediaPlayer = MediaPlayer()


     //   Thread().run {
            val maxVolume = audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
            val percent = 0.2f
            val twintyVolume = (maxVolume * percent).toInt()
            if (mediaPlayer.isPlaying) {
                val level = audio.getStreamVolume(AudioManager.STREAM_MUSIC)
                if ( level > twintyVolume) {
                    Toast.makeText(context,"audio level is $level", Toast.LENGTH_LONG).show()
                    audio.setStreamVolume(AudioManager.STREAM_MUSIC,twintyVolume,0)
                }
            }
      //      Thread.sleep(3000)
     //   }
        stopSelf()
        return Service.START_STICKY
    }

    override fun onBind(intent: Intent): IBinder? {
        //TODO for communication return IBinder implementation
        return null
    }

    override fun onDestroy() {
        super.onDestroy()
        Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show()
        val intent = Intent("com.kortex.mediafix.BootUpReceiver")
        sendBroadcast(intent)
    }
}

一旦服务被销毁,它就会调用引导广播接收器,后者又会再次调用该服务:

class BootUpReceiver: BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        context.startService(Intent(context, VolumeCheck::class.java))
    }
}

Manifest为:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kortex.mediafix">

    <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/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".BootUpReceiver"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <service android:name=".VolumeCheck" />
    </application>

</manifest>
EN

回答 1

Stack Overflow用户

发布于 2018-05-30 07:37:26

val intent = Intent("com.kortex.mediafix.BootUpReceiver")

该行不调用您的广播接收器,而是使用意图操作将意图创建为"com.kortex.mediafix.BootUpReceiver“

更改清单中的BootUpReceiver条目以接收此操作

<receiver android:name=".BootUpReceiver"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            <action android:name="com.kortex.mediafix.BootUpReceiver" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50594000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档