我在我的应用程序中有一个协同工作的Activity和Service。我已将服务配置为远程服务(已实现的AIDL),因此即使活动不可见,它也会继续运行。
该服务负责轮询服务器以获取数据,并在满足特定条件时发送警报通知。我不希望服务在活动可见时发送这些通知。
服务是否有办法了解任何特定活动的状态?特别是与之相关的活动?
使用清单更新以解决权限问题:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.interact.listen.android.voicemail"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MyAppName"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MyObjectDetails"/>
<service android:enabled="true" android:name=".MyService" />
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.foo.bar.EVENT"/>
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
我在Logcat中遇到的错误:
09-17 15:33:17.881: WARN/ActivityManager(53): Permission Denial: receiving Intent { act=com.foo.bar.myobject.EVENT (has extras) } to ProcessRecord{43928b40 223:com.foo.bar.myobject/10022} (pid=223, uid=10022) requires com.foo.bar.myobject.EVENT due to sender com.foo.bar.myobject (uid 10022)
09-17 15:33:48.901: WARN/ActivityManager(53): Permission Denial: receiving Intent { act=com.foo.bar.myobject.EVENT (has extras) } to com.foo.bar.myobject requires com.foo.bar.myobject.EVENT due to sender com.foo.bar.myobject (uid 10022)
发送广播的任务:
@Override
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
serviceHandler = new Handler();
serviceHandler.postDelayed(myTask, 100L);
Log.d(TAG, "onStart()");
}
class Task implements Runnable
{
public void run()
{
Log.i(TAG, "Getting myObjects...");
getMyObjects();
Bundle bundle = new Bundle();
bundle.putLongArray("ids", getIdsToUpdate());
Intent i = new Intent();
i.setAction(UPDATE_ACTION_STRING);
i.putExtras(bundle);
sendOrderedBroadcast(i, UPDATE_ACTION_STRING);
serviceHandler.postDelayed(this, 30000L);
}
}
}
答案 0 :(得分:8)
服务是否有办法了解任何特定活动的状态?特别是一项活动 是绑定吗?
您可以实现某种回调系统。
但是有一种更清洁的方法可以解决这个问题。 使用有序广播。活动有一个高优先级的接收器;将raise-a-notification逻辑置于低优先级接收器中。让活动的接收者呼叫使用事件总线:greenrobot的EventBus,abortBroadcast()
以阻止通知。关于这项技术,我有一个blog post。LocalBroadcastManager
,基于Rx的事件总线,甚至是MutableLiveData
。让服务向总线发送消息。当UI位于前台时,让UI层注册总线上的事件。如果没有人拿起放在公交车上的事件,请让服务加注Notification
。