我有一个应用程序,其中包含一个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
类有同样的例外,任何帮助??
答案 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