更改 BroadcastReceiver 里面的 ImageView 图片

Change ImageView picture inside BroadcastReceiver

快速提问,因为我自己无法弄明白。

首先,我不想出来当乞丐,所以我会告诉你我所知道的。

这段代码效果很好:

package com.edip.splashwallpaper;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.WallpaperManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.Switch;
import android.widget.Toast;

import com.squareup.picasso.Picasso;

import java.util.UUID;

public class MainActivity extends AppCompatActivity {

    ImageView mImageView;
    Switch mSwitch;
    Bitmap bitmap;

    public class AlarmReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {

//                getImage();
                Toast.makeText(MainActivity.this, "AlarmReceiver Works", Toast.LENGTH_SHORT).show();

        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mImageView = (ImageView) findViewById(R.id.imageView);
        mSwitch = (Switch) findViewById(R.id.switch1);

        setAlarmManager(); //TODO zbog ovog mi se gasi AlarmManager. FIX IT!

    }

    private void setAlarmManager(){
        AlarmManager alrm = (AlarmManager) getSystemService(ALARM_SERVICE);
        final String IF_ACTION = "com.edip.splashwallpaper.AlarmReceiver";
        IntentFilter intentFilter = new IntentFilter(IF_ACTION);
        AlarmReceiver mReceiver = new AlarmReceiver();
        registerReceiver(mReceiver, intentFilter);
        Intent i2 = new Intent(IF_ACTION);
        PendingIntent pi = PendingIntent.getBroadcast(this, 2, i2, 0);
        alrm.setRepeating(AlarmManager.RTC, 5000, 60000, pi);
        Toast.makeText(this, "Alarm Started", Toast.LENGTH_SHORT).show();
    }

    public void getImage() {

        String mRandomKey = UUID.randomUUID().toString(); //Generates random string

        Picasso.with(MainActivity.this)
                .load("https://source.unsplash.com/category/nature/1920x1080/")
                .placeholder(R.drawable.placeholder)
                .error(R.drawable.error_placeholder)
                .stableKey(mRandomKey) //new key is new picture
                .into(mImageView);

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                bitmap = ((BitmapDrawable) mImageView.getDrawable()).getBitmap();
                setAsWallpaper(bitmap);
            }
        }, 5000); //adding 5 sec delay

    }

    public void setAsWallpaper(Bitmap bitmap) {
        try {
            WallpaperManager wm = WallpaperManager.getInstance(MainActivity.this);

            wm.setBitmap(bitmap);
            Toast.makeText(this, "New Wallpaper Set", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "Failed to set Wallpaper", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

代码 运行ning 没有错误,背景图像每 XY 分钟更改一次。 问题是BroadcastReceiver class在MainActivity class里面,如果用户清理 "recent apps"(或任何其他类型的内存清理,即 CleanMaster)- AlarmManager 停止 .

现在,我试着单独制作 BroadcastReceiver class 并用 Toast 测试了它,它工作了 - AlarmManager 没有停止。 问题是,我从MainActivity调用getImage()函数时得到NullPointerException。我的猜测是,BroadcastReceiver 无法更新另一个 Activity.

ImageView

我也试过把getImage()函数放在BroadcastReceiver里面,但是又不能在里面设置findViewById(R.id.imageView)

服务 class 也是如此。 Toast 有效,但不能 运行 getImage() 起作用。

在这一点上,我真的不知道还能尝试什么。有什么想法吗?

谢谢 Selvin 帮助我。问题现已得到解答。