1

我开始学习android开发,所以我的知识目前真的很有限。我正在尝试播放广播,但我被卡住了,我无法理解我做错了什么。我正在尝试做的只是从广播接收器显示一个简单的 Toast。

Intent 是清单中定义的自定义意图:

<receiver android:name=".receiver.SendReceiver" android:enabled="true">
     <intent-filter>
   <action android:name="com.android.terralink.sem.SOCCIA"></action>
     </intent-filter>
</receiver>

接收器定义如下:

public class SearchReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent){
   Toast.makeText(context, "asasa", Toast.LENGTH_SHORT).show();
   }
}

在从应用程序调用的第一个操作中,我这样做:

Intent i2 = new Intent(this, SearchReceiver.class);
i2.setAction(CUSTOM_INTENT);
sendBroadcast(i2);

我检查了 Toast 代码在 Activity 中有效,但在广播中无效。是因为 Toast 不能在接收者上下文中显示?

另外,另一个关于android应用程序结构的问题。如果从我的 Activty 我允许用户在文本框中插入字符串并提交(按钮绑定),并且我希望应用程序在后台进行搜索并在结果准备好后通知用户,那么以下操作是否正确?1) 带有搜索框的主 Activity 2) 启动一个获取数据的服务,发送广播 3) 接收器通知用户并打开一个显示结果的 Activity

做这样的事情有意义吗?或者通知应该由服务本身在完成工作之前完成?

谢谢

4

3 回答 3

2

当我注册接收器时,我发现问题出在清单中。实际上,可以在接收器中显示 Toast 而没有任何问题。干杯

于 2010-09-23T00:17:42.973 回答
0

您不能在广播接收器中显示 Toast。一旦 onReceive() 调用完成,Android 通常会关闭您的进程(目前它只允许最多花费 10 秒)。由于 toast 是异步显示的,我认为它的上下文在显示之前就被杀死了。

作为 Toast 的替代方案,您可以查看 RemoveViews 的概念,用于从接收器更新另一个进程中的 UI。或者,启动一个显示祝酒词并立即关闭的活动。

对于您的问题 #2,我建议您在单击搜索按钮后保持活动运行,并为搜索启动一个 AsyncTask,它会在搜索结果进入时更新它们。

于 2010-09-20T11:29:42.097 回答
0

要显示来自广播接收器的 toast,我们可以使用以下代码:

public class ServiceReceiver extends BroadcastReceiver {

    Context context;

    @Override
    public void onReceive(Context context, Intent intent) {
        this.context = context;
        MyPhoneStateListener phoneListener = new MyPhoneStateListener();
        TelephonyManager telephony = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
    }

    private class MyPhoneStateListener extends PhoneStateListener {

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                Toast.makeText(context, "Idle call", Toast.LENGTH_LONG).show();
                Log.d("***************************DEBUG", "IDLE");
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                Log.d("***************************DEBUG", "OFFHOOK");
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                Toast.makeText(context, "Ringing call", Toast.LENGTH_LONG)
                        .show();
                Log.d("***************************DEBUG", "RINGING");
                break;
            }
        }
    }
}
于 2011-08-29T11:16:43.420 回答