在尚未创建 class 时管理 LocalBroadcastManager
Managing LocalBroadcastManager when a class is not yet created
我的基础水平是android,但我对应用程序的生命周期理解仍然有问题。所以我在做这个测试。
假设我有一个包含三个 classes 的应用程序:MainActivity、class A 和 class B。
Class A 收到 "external" 意向。我已经在清单中定义了接收器并且它运行良好。现在,我想要的是,当 class A 接收到意图时,它应该使用 LocalBroadcastManager 发送 "local" 意图。如果我在 Main Activity class 上注册接收器它会工作(它接收本地意图),所以我知道注册接收器的代码是可以的。但是,如果我在 class B 上这样做,它永远不会到达。这是完全正常的,因为我从来没有 used/defined class B 在任何地方,所以,由于 class B 从来没有以任何方式执行,接收者永远不会注册。
现在,这是我的问题(如果我要说的是错误的,请纠正我,因为我不确定我是否理解了):
由于我们不知道外部意图何时到来,也许 Main Activity(或者 class B,如果它被定义为 activity,例如)被销毁.但是,意图总是会到达 class A 因为我们将接收器部分放在清单中并且它将广播本地意图。 class A 应该怎么做才能确保另一个 class 收到它? (特别是如果我希望接收者进入 class B) class B 应该像单身人士一样,以确保只有一个 class B 存在,然后 class A 可以在需要时检查和创建 class B 在发送意图之前?会有更好的方法吗?也许在这种情况下不考虑使用本地广播(当接收者可能不存在时)?
总之,我想要的是有一个不在主activity中的class,可以随时接收本地广播的intent,即使app是没有积极使用,Android 有 destroyed/paused/etc 它。
感谢您的帮助!
更新:我会放一些代码,这样我就可以告诉你我想要什么。
首先,这是class ExternalReceiver(我之前称之为class A)。此 class 仅接收外部意图并在我的应用程序中广播本地意图:
public class ExternalReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TestApp","ExternalReceiver: I've received the intent "+intent.getAction());
Intent localIntent = new Intent("TestIntent");
localIntent.putExtra("text", "Hello, I'm just a test");
LocalBroadcastManager.getInstance(context).sendBroadcast(localIntent);
}
}
那么,这是我的主Activity class。如果我取消对 registerReceiver 的注释,MainActivity 将正确接收本地意图并记录 "text" 的内容。我的问题是,如果 activity 被破坏,那么本地意图就不会到达这里(如果另一个 class 是接收者,我也更喜欢):
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TestApp","MainActivity - OnCreate()");
// If I'd registered the receiver here, it would work as long as the activity exists:
//LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, new IntentFilter("TestIntent"));
}
private BroadcastReceiver localReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TestApp","MainActivity: I've received a local intent with text: "+intent.getStringExtra("text"));
}
};
}
现在,这是 LocalReceiver(class 我之前调用过 B)。我想要的是在这里接收本地意图。因为我从未使用过这个 class(不在清单中,也不在代码中),所以它永远不会到达这里,所以现在它永远不会收到意图。我也扩展了 Activity,但我没有把它放在清单中。事实上,我不需要它成为 activity,但我认为这可能会很好,因为这样我就可以重写 onCreate。非常欢迎提出建议,因为我应该如何定义这个 class:
public class LocalReceiver extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// I register the receiver.
LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, new IntentFilter("TestIntent"));
}
private BroadcastReceiver localReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TestApp","LocalReceiver: I've received a local intent with text: "+intent.getStringExtra("text"));
}
};
}
最后这是我的清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.testapp.localbroadcast"
android:versionCode="2"
android:versionName="@string/app_version" >
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/testapp"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.testapp.localbroadcast.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.testapp.localbroadcast.ExternalReceiver" >
<intent-filter>
<action android:name="com.testapp.localbroadcast.TEST" />
</intent-filter>
</receiver>
</application>
</manifest>
现在,为了测试所有内容,我将通过 adb 发送此意图:
adb shell am broadcast -a com.testapp.localbroadcast.TEST -n com.testapp.localbroadcast/.ExternalReceiver
我想要的:
- 在 ExternalReceiver 上有一个接收器,所以它只听一些意图
(com.testapp.localbroadcast.TEST 在我的例子中)。现在可以使用了。
- ExternalReceiver 然后应将本地意图广播到应用程序内的其他 class (LocalReceiver)。
- 那 class (LocalReceiver) 接收到意图然后就做点什么
(可能甚至没有更新任何 UI)。
我的问题:
- 我想确保接收本地 intent 的 class 即使在很长一段时间后仍能正常工作。例如,如果 activity 不存在,那么 ExternalReceiver 应该做一些事情来确保另一个 class 接收本地意图。我的猜测:使 LocalReceiver 成为 activity,然后,如果需要,ExternalReceiver class 应该启动它(如果它不存在)。即使 MainActivity 被破坏,我仍然不明白 ExternalReceiver 是如何工作的。不应该在任何 ExternalReceiver 开始工作时立即创建或恢复 MainActivity 吗?
我在 Main Activity 中做了一个以前的版本,只要一切都存在,一切都可以正常工作。现在我想分离我的代码并使其准备好工作,即使 Android 已将其关闭。可能我还不太明白这种东西是怎么工作的,所以非常欢迎任何建议。
再次感谢您的帮助!
您应该输入几行代码,以便我们了解您的确切需求。
这也是接收广播的 class 代码。
请将其设为全局 class。
并输入一些代码或确切您的要求以获得完美的解决方案。
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Boradcast your local contents from here
}
}
我的基础水平是android,但我对应用程序的生命周期理解仍然有问题。所以我在做这个测试。
假设我有一个包含三个 classes 的应用程序:MainActivity、class A 和 class B。
Class A 收到 "external" 意向。我已经在清单中定义了接收器并且它运行良好。现在,我想要的是,当 class A 接收到意图时,它应该使用 LocalBroadcastManager 发送 "local" 意图。如果我在 Main Activity class 上注册接收器它会工作(它接收本地意图),所以我知道注册接收器的代码是可以的。但是,如果我在 class B 上这样做,它永远不会到达。这是完全正常的,因为我从来没有 used/defined class B 在任何地方,所以,由于 class B 从来没有以任何方式执行,接收者永远不会注册。
现在,这是我的问题(如果我要说的是错误的,请纠正我,因为我不确定我是否理解了):
由于我们不知道外部意图何时到来,也许 Main Activity(或者 class B,如果它被定义为 activity,例如)被销毁.但是,意图总是会到达 class A 因为我们将接收器部分放在清单中并且它将广播本地意图。 class A 应该怎么做才能确保另一个 class 收到它? (特别是如果我希望接收者进入 class B) class B 应该像单身人士一样,以确保只有一个 class B 存在,然后 class A 可以在需要时检查和创建 class B 在发送意图之前?会有更好的方法吗?也许在这种情况下不考虑使用本地广播(当接收者可能不存在时)?
总之,我想要的是有一个不在主activity中的class,可以随时接收本地广播的intent,即使app是没有积极使用,Android 有 destroyed/paused/etc 它。
感谢您的帮助!
更新:我会放一些代码,这样我就可以告诉你我想要什么。
首先,这是class ExternalReceiver(我之前称之为class A)。此 class 仅接收外部意图并在我的应用程序中广播本地意图:
public class ExternalReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TestApp","ExternalReceiver: I've received the intent "+intent.getAction());
Intent localIntent = new Intent("TestIntent");
localIntent.putExtra("text", "Hello, I'm just a test");
LocalBroadcastManager.getInstance(context).sendBroadcast(localIntent);
}
}
那么,这是我的主Activity class。如果我取消对 registerReceiver 的注释,MainActivity 将正确接收本地意图并记录 "text" 的内容。我的问题是,如果 activity 被破坏,那么本地意图就不会到达这里(如果另一个 class 是接收者,我也更喜欢):
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TestApp","MainActivity - OnCreate()");
// If I'd registered the receiver here, it would work as long as the activity exists:
//LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, new IntentFilter("TestIntent"));
}
private BroadcastReceiver localReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TestApp","MainActivity: I've received a local intent with text: "+intent.getStringExtra("text"));
}
};
}
现在,这是 LocalReceiver(class 我之前调用过 B)。我想要的是在这里接收本地意图。因为我从未使用过这个 class(不在清单中,也不在代码中),所以它永远不会到达这里,所以现在它永远不会收到意图。我也扩展了 Activity,但我没有把它放在清单中。事实上,我不需要它成为 activity,但我认为这可能会很好,因为这样我就可以重写 onCreate。非常欢迎提出建议,因为我应该如何定义这个 class:
public class LocalReceiver extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// I register the receiver.
LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver, new IntentFilter("TestIntent"));
}
private BroadcastReceiver localReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TestApp","LocalReceiver: I've received a local intent with text: "+intent.getStringExtra("text"));
}
};
}
最后这是我的清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.testapp.localbroadcast"
android:versionCode="2"
android:versionName="@string/app_version" >
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/testapp"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.testapp.localbroadcast.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.testapp.localbroadcast.ExternalReceiver" >
<intent-filter>
<action android:name="com.testapp.localbroadcast.TEST" />
</intent-filter>
</receiver>
</application>
</manifest>
现在,为了测试所有内容,我将通过 adb 发送此意图:
adb shell am broadcast -a com.testapp.localbroadcast.TEST -n com.testapp.localbroadcast/.ExternalReceiver
我想要的:
- 在 ExternalReceiver 上有一个接收器,所以它只听一些意图 (com.testapp.localbroadcast.TEST 在我的例子中)。现在可以使用了。
- ExternalReceiver 然后应将本地意图广播到应用程序内的其他 class (LocalReceiver)。
- 那 class (LocalReceiver) 接收到意图然后就做点什么 (可能甚至没有更新任何 UI)。
我的问题:
- 我想确保接收本地 intent 的 class 即使在很长一段时间后仍能正常工作。例如,如果 activity 不存在,那么 ExternalReceiver 应该做一些事情来确保另一个 class 接收本地意图。我的猜测:使 LocalReceiver 成为 activity,然后,如果需要,ExternalReceiver class 应该启动它(如果它不存在)。即使 MainActivity 被破坏,我仍然不明白 ExternalReceiver 是如何工作的。不应该在任何 ExternalReceiver 开始工作时立即创建或恢复 MainActivity 吗?
我在 Main Activity 中做了一个以前的版本,只要一切都存在,一切都可以正常工作。现在我想分离我的代码并使其准备好工作,即使 Android 已将其关闭。可能我还不太明白这种东西是怎么工作的,所以非常欢迎任何建议。
再次感谢您的帮助!
您应该输入几行代码,以便我们了解您的确切需求。 这也是接收广播的 class 代码。 请将其设为全局 class。 并输入一些代码或确切您的要求以获得完美的解决方案。
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Boradcast your local contents from here
}
}