如何通过服务或使用会议室数据库

时间:2019-09-05 09:19:43

标签: java android

美好的一天

即使应用程序被杀死,该应用程序也需要监视传入的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,那么我们如何在服务内部使用会议室数据库,或者在后台进程中进行查询的最佳方法是什么?

2 个答案:

答案 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;

我不知道这种方法是否是一种好的做法,但似乎对我有用。