在尚未创建类时管理LocalBroadcastManager

时间:2016-02-06 12:30:11

标签: android android-intent receiver localbroadcastmanager

我在android上有一个基本级别,我仍然无法理解应用程序的生命周期。所以我正在做这个测试。

让我们说我的应用程序有三个类:MainActivity,A类和B类。

A级接收"外部"意图。我在清单中定义了接收器并且运行良好。现在,我想要的是,当A级接收和意图时,它应该发送一个" local"意图使用LocalBroadcastManager。如果我在Main Activity类上注册接收器它可以工作(它接收本地意图),所以我知道注册接收器的代码是可以的。但是,如果我在B级上这样做,它永远不会到来。这是完全正常的,因为我从未在任何地方使用/定义过B类,因此,因为B类永远不会以任何方式执行,所以接收器永远不会被注册。

现在,这是我的问题(请纠正我,如果我要说的是错的,因为我不确定我是否理解它):

由于我们不知道外部意图何时会到来,因此主要活动(或B类,如果它被定义为活动,例如)可能会被销毁。但是,意图总是会到达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将正确接收本地意图并记录" text"的内容。我的问题是,如果活动被破坏,那么本地意图就不会到达这里(如果另一个类是接收者,我也会优先考虑):

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类)。我想要的是在这里接收本地意图。由于我从未使用过这个类(不在清单中而不在代码中),因此它永远不会到达此处,所以现在它永远不会收到意图。我也延长了活动,但我还没有把它放在清单中。事实上,我不需要它作为一项活动,但我想也许它会很好,因为那时我可以覆盖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吗?

我在主要活动中做了以前的版本,只要一切都存在,一切正常。现在我想分离我的代码,即使Android关闭了它也准备好了。也许我还没有理解这种事情是如何运作的,所以任何建议都非常受欢迎。

再次感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您应该添加一些代码,以便我们了解您确切需要的内容。 这也是接收广播的类代码。 请把它作为全球课。 并提出一些代码或完全解决方案的要求。

quiz.findOneAndUpdate({quizName:req.params.quizName}, function(err, quiz) {
  if(err) {
    res.status(422).send("Problem: "+err.message);
  } else {
    quiz.questions.push(question);
    res.redirect('/quiz/'+req.params.quizName+'/questions');
  }
});