Я хочу получить доступ к базе данных из liveata в классе broadcastReceiver, но не могу получить к ней доступ, я сделал это ..
AndroidMenifest. xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.birthdaynotifier">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".AddEditActivity"
android:parentActivityName=".MainActivity"></activity>
<activity android:name=".MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".notification.AlertReceiver"
android:directBootAware="true"
android:enabled="false"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
в основной деятельности есть некоторый фрагмент, в котором вещательный приемник называется
HomeFragment. java
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootview = inflater.inflate(R.layout.fragment_home, container, false);
RecyclerView recyclerView = rootview.findViewById(R.id.recyclerView_home_container);
recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));
recyclerView.setHasFixedSize(true);
final BirthDateAdapter adapter = new BirthDateAdapter();
recyclerView.setAdapter(adapter);
birthDateViewModel = ViewModelProviders.of(this).get(BirthDateViewModel.class);
birthDateViewModel.getAllBirthDate().observe(getViewLifecycleOwner(), new Observer<List<BirthDate>>() {
@Override
public void onChanged(@Nullable List<BirthDate> birthDates) {
//update RecyclerView
String sortListName = sharedpreferences.getString(sortTitle,null);
sortList.setSelection(spinnerAdapter.getPosition(sortListName));
if(sortListName.equals("Date")){
Collections.sort(birthDates, new Comparator<BirthDate>() {
@Override
public int compare(BirthDate t1, BirthDate t2) {
if(t1.getMonth()<t2.getMonth()){
return -1;
}else if(t1.getMonth()>t2.getMonth()){
return 1;
}else{
if(t1.getDay()<t2.getDay()){
return -1;
}else{
return 1;
}
}
}
});
}else{
Collections.sort(birthDates, new Comparator<BirthDate>() {
@Override
public int compare(BirthDate birthDate, BirthDate t1) {
return birthDate.getName().compareToIgnoreCase(t1.getName());
}
});
}
adapter.submitList(birthDates);
}
});
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, int direction) {
new AlertDialog.Builder(getContext())
.setTitle("Delete entry")
.setMessage("Are you sure you want to delete this entry?")
.setCancelable(false)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
birthDateViewModel.delete(adapter.getBirthDateAt(viewHolder.getAdapterPosition()));
Toast.makeText(getContext(), "BirthDate deleted", Toast.LENGTH_SHORT).show();
BirthDate birthDate =adapter.getBirthDateAt(viewHolder.getAdapterPosition());
int id = birthDate.getId();
String name = birthDate.getName();
AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getContext(), AlertReceiver.class);
intent.putExtra("message",name);
intent.putExtra("Id",id);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), id, intent, 0);
alarmManager.cancel(pendingIntent);
ComponentName receiver = new ComponentName(getContext(), AlertReceiver.class);
PackageManager pm = getContext().getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
adapter.notifyDataSetChanged();
}
})
.setIcon(R.drawable.ic_warning_black_24dp)
.show();
}
}).attachToRecyclerView(recyclerView);
adapter.setOnItemClickListener(new BirthDateAdapter.OnItemClickListener() {
@Override
public void onItemClick(BirthDate birthDate) {
Intent intent = new Intent(getActivity(), AddEditActivity.class);
intent.putExtra(AddEditActivity.EXTRA_ID, birthDate.getId());
intent.putExtra(AddEditActivity.EXTRA_NAME, birthDate.getName());
intent.putExtra(AddEditActivity.EXTRA_TIME, birthDate.getTime());
intent.putExtra(AddEditActivity.EXTRA_DAY, birthDate.getDay());
intent.putExtra(AddEditActivity.EXTRA_MONTH, birthDate.getMonth());
intent.putExtra(AddEditActivity.EXTRA_NOTIFICATION, birthDate.getNotification());
startActivityForResult(intent, EDIT_NEW_REQUEST);
}
});
return rootview;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ADD_NEW_REQUEST && resultCode == RESULT_OK) {
int id = data.getIntExtra(AddEditActivity.EXTRA_ID, -1);
String name = data.getStringExtra(AddEditActivity.EXTRA_NAME);
String time = data.getStringExtra(AddEditActivity.EXTRA_TIME);
int day = data.getIntExtra(AddEditActivity.EXTRA_DAY, 1);
int month = data.getIntExtra(AddEditActivity.EXTRA_MONTH, 1);
boolean notificatiion = data.getBooleanExtra(AddEditActivity.EXTRA_NOTIFICATION,true);
BirthDate birthDate = new BirthDate(name, time, day, month, notificatiion);
birthDateViewModel.insert(birthDate);
if(notificatiion){
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a");
Date date = null;
try {
date = sdf.parse(time);
} catch (ParseException e) { }
Calendar calendar = Calendar.getInstance();
Calendar currentTime = Calendar.getInstance();
int year;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
LocalDate currentDate = LocalDate.now();
year = currentDate.getYear();
}else{
Date today = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(today);
year = cal.get(Calendar.YEAR);
}
calendar.setTime(date);
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,month-1);
calendar.set(Calendar.DAY_OF_MONTH,day);
calendar.set(Calendar.SECOND, 0);
/*Toast.makeText(getContext(),calendar.get(Calendar.HOUR)+" : "+calendar.get(Calendar.MINUTE)+
" ( "+calendar.get(Calendar.YEAR)+" - "+calendar.get(Calendar.MONTH)+" - "+calendar.get(Calendar.DAY_OF_MONTH)+
" Date : "+calendar.get(Calendar.DATE)+" )",Toast.LENGTH_LONG ).show();*/
if (calendar.before(Calendar.getInstance())) {
calendar.add(Calendar.YEAR, 1);
}
AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getContext(), AlertReceiver.class);
intent.putExtra("message",name);
intent.putExtra("Id",id);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), id, intent, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
ComponentName receiver = new ComponentName(getContext(), AlertReceiver.class);
PackageManager pm = getContext().getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
}
}
AlertReceiver. java
public class AlertReceiver extends BroadcastReceiver implements ViewModelStoreOwner {
BirthDateViewModel birthDateViewModel;
@Override
public void onReceive(Context context, Intent intent) {
birthDateViewModel = ViewModelProviders.of(this).get(BirthDateViewModel.class);
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
List<BirthDate> birthDates = birthDateViewModel.getAllBirthDate().getValue();
//some code
}else{
String message = "Your friend ! please wish ..";
int id = intent.getIntExtra("Id",1);
NotificationHelper notificationHelper = new NotificationHelper(context);
NotificationCompat.Builder nb = notificationHelper.getChannelNotification(message);
notificationHelper.getManager().notify(id, nb.build());
List<BirthDate> birthDates = birthDateViewModel.getAllBirthDate().getValue();
}
BirthDateDao. java
@Dao
public interface BirthDateDao {
@Insert
void insert(BirthDate birthDate);
@Update
void update(BirthDate birthDate);
@Delete
void delete(BirthDate birthDate);
@Query("DELETE FROM birthdate_table")
void deleteAllBirthDate();
@Query("SELECT * FROM birthdate_table ORDER BY name ")
LiveData<List<BirthDate>> getAllBirthdate();
}
BirthdateViewModel. java
public class BirthDateViewModel extends AndroidViewModel {
private BirthDateRepository repository;
private LiveData<List<BirthDate>> allBirthDate;
public BirthDateViewModel(@NonNull Application application) {
super(application);
repository = new BirthDateRepository(application);
allBirthDate = repository.getAllBirthDate();
}
public void insert(BirthDate birthDate) {
repository.insert(birthDate);
}
public void update(BirthDate birthDate) {
repository.update(birthDate);
}
public void delete(BirthDate birthDate) {
repository.delete(birthDate);
}
public void deleteAllBirthDate() {
repository.deleteAllBirthDate();
}
public LiveData<List<BirthDate>> getAllBirthDate() {
return allBirthDate;
}
}
BirthDateRepository. java
public class BirthDateRepository {
private BirthDateDao birthDateDao;
private LiveData<List<BirthDate>> allBirthDate;
public BirthDateRepository(Application application) {
BirthDateDatabase database = BirthDateDatabase.getInstance(application);
birthDateDao = database.birthDateDao();
allBirthDate = birthDateDao.getAllBirthdate();
}
public void insert(BirthDate birthDate) {
new InsertBirthDateAsyncTask(birthDateDao).execute(birthDate);
}
public void update(BirthDate birthDate) {
new UpdateBirthDateAsyncTask(birthDateDao).execute(birthDate);
}
public void delete(BirthDate birthDate) {
new DeleteBirthDateAsyncTask(birthDateDao).execute(birthDate);
}
public void deleteAllBirthDate() {
new DeleteAllBirthDatesAsyncTask(birthDateDao).execute();
}
public LiveData<List<BirthDate>> getAllBirthDate() {
return allBirthDate;
}
private static class InsertBirthDateAsyncTask extends AsyncTask<BirthDate, Void, Void> {
private BirthDateDao birthDateDao;
private InsertBirthDateAsyncTask(BirthDateDao birthDateDao) {
this.birthDateDao = birthDateDao;
}
@Override
protected Void doInBackground(BirthDate... birthDates) {
birthDateDao.insert(birthDates[0]);
return null;
}
}
private static class UpdateBirthDateAsyncTask extends AsyncTask<BirthDate, Void, Void> {
private BirthDateDao birthDateDao;
private UpdateBirthDateAsyncTask(BirthDateDao birthDateDao) {
this.birthDateDao = birthDateDao;
}
@Override
protected Void doInBackground(BirthDate... birthDates) {
birthDateDao.update(birthDates[0]);
return null;
}
}
private static class DeleteBirthDateAsyncTask extends AsyncTask<BirthDate, Void, Void> {
private BirthDateDao birthDateDao;
private DeleteBirthDateAsyncTask(BirthDateDao birthDateDao) {
this.birthDateDao = birthDateDao;
}
@Override
protected Void doInBackground(BirthDate... birthDates) {
birthDateDao.delete(birthDates[0]);
return null;
}
}
private static class DeleteAllBirthDatesAsyncTask extends AsyncTask<Void, Void, Void> {
private BirthDateDao birthDateDao;
private DeleteAllBirthDatesAsyncTask(BirthDateDao birthDateDao) {
this.birthDateDao = birthDateDao;
}
@Override
protected Void doInBackground(Void... voids) {
birthDateDao.deleteAllBirthDate();
return null;
}
}
}
BirthdateDatabase. java
public abstract class BirthDateDatabase extends RoomDatabase {
private static BirthDateDatabase instance;
public abstract BirthDateDao birthDateDao();
public static synchronized BirthDateDatabase getInstance(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(context.getApplicationContext(),
BirthDateDatabase.class, "birthdate_database")
.fallbackToDestructiveMigration()
.addCallback(roomCallback)
.build();
}
return instance;
}
private static RoomDatabase.Callback roomCallback = new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
new PopulateDbAsyncTask(instance).execute();
}
};
private static class PopulateDbAsyncTask extends AsyncTask<Void, Void, Void> {
private BirthDateDao birthDateDao;
private PopulateDbAsyncTask(BirthDateDatabase db) {
birthDateDao = db.birthDateDao();
}
@Override
protected Void doInBackground(Void... voids) {
return null;
}
}
}
Теперь, как я могу получить доступ к базе данных liveata в AlertReceiver. java и сохраните данные в списке с именами дат рождения. как я могу это сделать ??