在尚未创建 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

我想要的:

我的问题:

我在 Main Activity 中做了一个以前的版本,只要一切都存在,一切都可以正常工作。现在我想分离我的代码并使其准备好工作,即使 Android 已将其关闭。可能我还不太明白这种东西是怎么工作的,所以非常欢迎任何建议。

再次感谢您的帮助!

您应该输入几行代码,以便我们了解您的确切需求。 这也是接收广播的 class 代码。 请将其设为全局 class。 并输入一些代码或确切您的要求以获得完美的解决方案。

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
      //Boradcast your local contents from here
    }
}