在`Service`类中运行新的`runnableThread`时出现java.lang.ClassCastException

时间:2014-04-27 13:48:03

标签: java android broadcastreceiver android-service classcastexception

我有一个应用程序,其中包含一个broadcastReceiver,可以收听所有新收到的短信 。如果收到任何新的短信BroadcastReceiver启动运行GPS并返回坐标的后台Service,则此坐标检索需要运行新线程,在服务类中没有getApplicationContext()所以我使用了' getContentBase()'为了启动新线程,这是代码

((Activity)getBaseContext())。runOnUiThread(new Runnable(){

                ((Activity)getBaseContext()).runOnUiThread(new Runnable() {


                        @Override
                    public void run() {
                        // TODO Auto-generated method stub

                        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

                        LocationListener locationListener = new MyLocationListener();
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER, 5000, 10,
                                locationListener);
                    }
                }

我得到了这个例外

 E/AndroidRuntime(24700): java.lang.ClassCastException: android.app.ContextImpl cannot be cast to android.app.Activity

这是接收器在清单中定义的方式

    <receiver
        android:name=".BroadCastReceiver"
        android:exported="true" >
        <intent-filter android:priority="1000" >
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

以下是服务在BroadcastReceiver

中的启动方式
@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub

    context.startService(new Intent(con,
            MyService.class));

    }

,例外是在这一行

                ((Activity)getBaseContext()).runOnUiThread(new Runnable() 

我已经通过堆栈和谷歌进行了大量搜索,非答案解决了我的问题并尝试将上下文从BroadCastReceiver发送到Service类有同样的例外,任何帮助??

1 个答案:

答案 0 :(得分:3)

首先,Service扩展ContextWrapper,因此是Context。如果您需要对Context的引用,您可以简单地引用您的服务。您无法将服务的基本上下文强制转换为Activity

如果您想使用服务的UI线程,请查看使用Handler创建Looper.getMainLooper()

...
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
            @Override
            public void run() {
                LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

                LocationListener locationListener = new MyLocationListener();

                locationManager.requestLocationUpdates(
                        LocationManager.GPS_PROVIDER, 5000, 10, locationListener);
            });
...

Android文档提供了有关与UI线程进行通信的良好信息。看看这里:

http://developer.android.com/training/multiple-threads/communicate-ui.html