美好的一天
即使应用程序被杀死,该应用程序也需要监视传入的SMS,因此我认为Service是完成这项工作的最佳方法,但是当我尝试调用viewmodel时遇到了问题。
我正在尝试使用Service对我的项目从后台进程中选择,插入,更新,删除我的房间数据库。这是我的简单代码。
public class ReadIncomingSMS extends Service {
RoomViewModel model;
@Override
public IBinder onBind(Intent intent) { return null; }
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
model = ViewModelProviders.of((FragmentActivity) getApplicationContext()).get(RoomViewModel.class);
}
}
但是logcat说,
java.lang.RuntimeException:无法启动服务 com.mgb.textvote.services.ReadIncomingSMS@3ae6b5cf与Intent { cmp = com.mgb.textvote / .services.ReadIncomingSMS}: java.lang.ClassCastException:无法投射android.app.Application 到androidx.fragment.app.FragmentActivity 在android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3119)
原因:java.lang.ClassCastException:android.app.Application 无法转换为androidx.fragment.app.FragmentActivity 在com.mgb.textvote.services.ReadIncomingSMS.onStartCommand(ReadIncomingSMS.java:47)
如果无法将应用程序上下文强制转换为fragmentActivity,那么我们如何在服务内部使用会议室数据库,或者在后台进程中进行查询的最佳方法是什么?
答案 0 :(得分:0)
您正试图在Service中访问FragmentActivity ViewModel。
为Service创建单独的ViewModel,它将起作用。
答案 1 :(得分:0)
感谢安东尼回答,
我更改了这样的代码,而不是在Service中访问FragmentActivity ViewModel。
到我的MainActivity.java
public class MainActivity extends AppCompatActivity {
public static RoomViewModel model;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
model = ViewModelProviders.of(this).get(RoomViewModel.class);
}
}
然后在我的服务中
代替
model = ViewModelProviders.of((FragmentActivity) getApplicationContext()).get(RoomViewModel.class);
我将其更改为
model = MainActivity.model;
我不知道这种方法是否是一种好的做法,但似乎对我有用。