我在 android 上有一个基本的水平,但我仍然无法理解应用程序的生命周期。所以我正在做这个测试。
假设我有一个包含三个类的应用程序:MainActivity、A 类和 B 类。
A 类接收“外部”意图。我已经在清单中定义了接收器,它运行良好。现在,我想要的是,当 A 类接收和意图时,它应该使用 LocalBroadcastManager 发送“本地”意图。如果我在 Main Activity 类上注册接收器,它可以工作(它接收本地意图),所以我知道注册接收器的代码是可以的。但是,如果我在 B 类上这样做,它永远不会到达。这是完全正常的,因为我从未在任何地方使用/定义过 B 类,因此,由于 B 类从未以任何方式执行,因此接收者永远不会被注册。
现在,这是我的问题(如果我要说的是错误的,请纠正我,因为我不确定我是否理解它):
由于我们不知道外部意图何时到来,可能主 Activity(或 B 类,如果它被定义为 Activity,例如)被销毁。但是,意图总是会到达 A 类,因为我们将接收器部分放在清单中,它将广播本地意图。A 类应该怎么做才能确保其他类收到它?(特别是如果我希望接收者进入 B 类) B 类是否应该类似于单例,以确保存在一个且只有一个 B 类,然后 A 类可以在发送意图之前检查并根据需要创建 B 类? 会有更好的方法来做到这一点吗?也许在这种情况下不考虑使用本地广播(当接收器可能不存在时)?
简而言之,我想要的是有一个不在主要活动中的类,并且可以随时接收本地广播的意图,即使应用程序没有被积极使用并且 Android 已经销毁/暂停/等等它。
谢谢你的帮助!
更新:我会放一些代码,这样我就可以告诉你我想要什么。
首先,这是类 ExternalReceiver(我之前称之为 A 类)。此类仅接收外部意图并在我的应用程序中广播本地意图:
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);
}
}
然后,这是我的 MainActivity 类。如果我取消注释 registerReceiver,MainActivity 将正确接收本地意图并记录“文本”的内容。我的问题是,如果活动被破坏,那么本地意图就不会到达这里(如果另一个类是接收者,我也更喜欢):
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(我之前称为 B 的类)。我想要的是在这里接收本地意图。因为我从来没有使用过这个类(不在清单中也没有在代码中)它永远不会到达这里,所以现在它永远不会收到意图。我也扩展了 Activity,但我没有把它放在清单中。事实上,我不需要它成为一个活动,但我认为它可能会很好,因为这样我就可以覆盖 onCreate。非常欢迎提出建议,因为我应该如何定义这个类:
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 应该向应用程序中的其他类 (LocalReceiver) 广播本地意图。
- 该类 (LocalReceiver) 接收意图,然后只是做某事(可能甚至不更新任何 UI)。
我的问题:
- 我想确保接收本地意图的类即使在很长一段时间后也能正常工作。例如,如果活动不存在,则 ExternalReceiver 应该做一些事情来确保其他类接收本地意图。我的猜测:让 LocalReceiver 成为一个活动,然后,如果需要,ExternalReceiver 类应该在它不存在时启动它。即使 MainActivity 被破坏,我仍然不明白 ExternalReceiver 是如何工作的。不应该在任何 ExternalReceiver 开始工作后立即创建或恢复 MainActivity 吗?
我在 Main Activity 中做了一个以前的版本,只要一切都存在,一切正常。现在我想分离我的代码并让它准备好工作,即使 Android 已经关闭它。也许我还没有理解这种事情是如何工作的,所以非常欢迎任何建议。
再次感谢你的帮助!