我非常喜欢开源贡献广场已经对Android社区做了什么,并正在调查他们的最新贡献Otto(事件总线)
深入挖掘我看到Otto使用反射并且没有有序广播(一种模式,其中未消息的消息从一个接收器传递到下一个接收器,听取相同类型的事件)Otto相信更多的火灾和忘记模型.
现在android LocalBroadcastManager在其v4支持库中有(LBM)用于相同的目的,尽管它更笨重并且对传递的对象有更多限制.但在更明亮的一面,它确实支持有序广播,它更像是正常的广播.
Otto和LBM都处于相同的处理空间内,因此就速度而言,我猜两者都是相同的.我能看到的唯一真正的区别是Otto允许您定义自定义事件,而您不必序列化/包裹对象.
因此,我真正的问题是,如果LBM做同样的事情,你何时会使用Otto.
参考文献:
http://nick.perfectedz.com/otto-event-system/
https://plus.google.com/107049228697365395345/posts/6j4ANWngCUY
无论如何在AndroidManifest.xml中注册BroadcastReceiver并接收由LocalBroadcastManager发送的广播?
目前我必须打电话
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
Run Code Online (Sandbox Code Playgroud)
要注册一个Receiver,在AndroidManifest.xml中声明将无法正常工作.但这意味着我必须确切地知道接收者的包名和类名,而不仅仅是意图过滤器.是否可以在清单文件中声明接收器?
以下是我目前的代码.
AndroidManifest.xml中:
...
<receiver
android:name="com.example.test.MessageReceiver"
android:enabled="true" >
<intent-filter>
<action android:name="com.m2x.test.intent.MESSAGE_RECEIVED" />
</intent-filter>
</receiver>
...
Run Code Online (Sandbox Code Playgroud)
MainActivity.java:
Intent intent = new Intent();
intent.setAction("com.m2x.test.intent.MESSAGE_RECEIVED");
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(mContext.get());
manager.sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
MessageReceiver.java
public class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.m2x.test.intent.MESSAGE_RECEIVED")) {
Toast.makeText(context, "user message received", Toast.LENGTH_SHORT).show();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在 Android 中处理这个项目,其中一个方面需要一个带有前台服务的 CountdownTimer。Stack Overflow 上的其他一些答案提到 LocalBroadcastManager 适合我的需求。
然而,Android Developers 中的文档提到它已被弃用。关于我应该在它的位置使用什么的任何建议?文档提到了使用 LiveData,但我想知道是否有更简单的替代方法。
我有这个代码:
private AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
private PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, new Intent("my action-name"), 0);
alarmManager.setInexactRepeating((int)AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + autoUpdateIntervalInMinutes * 60 * 1000, autoUpdateIntervalInMinutes * 60 * 1000, alarmIntent);
Run Code Online (Sandbox Code Playgroud)
但是我想为LocalBroadcastManager更改它.这可能吗?
我在偏好活动中注册广播接收器,并从(唤醒)IntentService发送(同步)广播.显然onReceive在服务的线程上运行.这是我的错吗?是否记录了行为?
偏好活动:
public final class SettingsActivity extends BaseSettings {
private static CharSequence sMasterKey;
private CheckBoxPreference mMasterPref;
// Receiver
/** If the master preference is changed externally this reacts */
private BroadcastReceiver mExternalChangeReceiver =
new ExternalChangeReceiver();
public static void notifyMonitoringStateChange(Context ctx,
CharSequence action, boolean isToggling) {
final LocalBroadcastManager lbm = LocalBroadcastManager
.getInstance(ctx);
Intent intent = new Intent(ctx, ExternalChangeReceiver.class);
intent.setAction(action.toString());
intent.putExtra(TOGGLING_MONITORING_IN_PROGRESS, isToggling);
lbm.sendBroadcastSync(intent);
}
@Override
protected void onStart() {
super.onStart();
final LocalBroadcastManager lbm = LocalBroadcastManager
.getInstance(this);
lbm.registerReceiver(mExternalChangeReceiver, new IntentFilter(
ac_toggling.toString()));
}
@Override …Run Code Online (Sandbox Code Playgroud) multithreading android broadcastreceiver localbroadcastmanager
我有一项服务需要通知主要活动。我用过LocalBroadcastManager,效果很好,但是LocalBroadcastManager已被弃用。
这是我在服务中的实际代码:
public void onTokenRefresh() {
/* build the intent */
Intent intent = new Intent(ACTION_TOKENREFRESHED);
intent.putExtra("token", "xxx");
/* send the data to registered receivers */
try{
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
} catch (Throwable e){
//no exception handling
}
}
Run Code Online (Sandbox Code Playgroud)
在主要活动中,我收到如下通知:
context.registerReceiver(broadcastReceiver, intentFilter);
Run Code Online (Sandbox Code Playgroud)
我现在可以使用什么来删除已弃用的警告?我发现的有关从服务向活动发送数据的所有示例都使用 LocalBroadcastManager。有人可以给我一个可行的模型来迁移现有代码吗?
笔记
在我的示例中, TheonTokenRefresh是从 a 内部调用的background thread。这非常重要,因为这意味着我可以同时接收多个 onTokenRefresh,并且我必须将所有这些令牌转发到该活动。大多数提供的解决方案都使用实时数据,但做出如下声明:
public static final MutableLiveData<String> tokenLiveData = new MutableLiveData<>();
Background Thread1:
tokenLiveData.postValue(Token1);
Background Thread2 (at same time):
tokenLiveData.postValue(Token2);
Run Code Online (Sandbox Code Playgroud)
是否会将同时收到的所有代币转发到观察代币LiveData 的主要活动?主 Activity 一定会收到 token1 和 …
java android broadcastreceiver android-service localbroadcastmanager
我有一个Activity我在BroadcastReceiver本地注册如下:
public class SomeActivity extends Activity{
public static final String PERFORM_SOME_ACTION = "PERFORM_SOME_ACTION";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.some_activity_layout);
.....
.....
IntentFilter filter = new IntentFilter();
filter.addAction(PERFORM_SOME_ACTION);
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// perform some action ...
}
};
registerReceiver(receiver, filter);
}
.....
.....
}
Run Code Online (Sandbox Code Playgroud)
我有一个Service广播Intent如下:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Intent i = new Intent(SomeActivity.PERFORM_SOME_ACTION);
sendBroadcast(i); …Run Code Online (Sandbox Code Playgroud) android android-service android-broadcast localbroadcastmanager android-broadcastreceiver
有没有办法判断是否收到了LocalBroadcastManager广播?还是正在听?
基本上我有一个IntentService监听Google Cloud Messages.当它得到一个我需要显示通知或警告我的主要服务,有一个新的消息 - 至关重要的是,我不想要两个!所以我需要知道我的主要服务是否处理了该消息......
显然,可以使用sendOrderedBroadcast和BroadcastReceiver来完成它,但这对于我简单的私有内部进程需求来说似乎有些过分.
android broadcastreceiver android-broadcast localbroadcastmanager
虽然可以通过代码声明"本地"BroadcastReceiver,因此它接收通过LocalBroadcastManager.Ex发布的意图.
LocalBroadcastManager.getInstance(this).registerReceiver(new FooReceiver(), new IntentFilter("foo_intent_filter"));
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以通过manifest .xml(cleaner)声明这样的接收器.
当我使用"清单方式"时,接收者没有"接收"意图.
<receiver
android:name="FooReceiver"
android:enabled="true"
android:exported="false" >
<intent-filter>
<action android:name="foo_intent_filter" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?或代码方式是唯一可行的解决方案.
谢谢
在将eclipse项目导入Android Studio时遇到此错误。它显示了将库添加Gradle: com.android.support:support-core-utils-27.1.1到类路径的建议。我已经在build.gradle文件中添加了库。
这是我的gradle文件。
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
buildToolsVersion "28.0.0"
defaultConfig {
applicationId "com.example.tracking"
minSdkVersion 17
targetSdkVersion 27
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
allprojects {
repositories {
google()
}
}
dependencies {
implementation project(':asciiProtocol')
implementation project(':deviceList')
implementation project(':captureActivity')
implementation 'com.android.support:support-v4:27.1.1'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation "com.android.support:support-core-utils:27.1.1"
implementation 'com.google.code.gson:gson:2.8.2'
implementation 'com.google.code.gson:gson:2.8.2'
implementation 'com.google.code.gson:gson:2.8.2'
implementation files('libs/opencsv-2.3.jar')
implementation files('libs/rfid.reader.api.jar')
implementation files('libs/scannercontrol.jar')
implementation files('libs/Zebra.jar')
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details -> …Run Code Online (Sandbox Code Playgroud)