-1

我在 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 已经关闭它。也许我还没有理解这种事情是如何工作的,所以非常欢迎任何建议。

再次感谢你的帮助!

4

1 回答 1

0

您应该输入一些代码,以便我们了解您的确切需求。这也是接收广播的类的代码。请把它作为全局类。并输入一些代码或明确您对完美解决方案的要求。

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
      //Boradcast your local contents from here
    }
}
于 2016-02-06T12:52:40.917 回答