1

程序目的:我正在尝试制作一个应用程序,通过发出 Intent.ACTION_SCREEN_ON 广播来计算用户检查手机的次数。然后它增加一个计数器并用新的计数器更新活动。

问题:这一切都很好,但是一旦我从应用程序托盘中滑动应用程序,计数器就会回到零。 显然应该发生的是计数器将继续。我尝试将计数器值保存在服务 onDestroy 中,然后再次调用它 onCreate 但从未调用过 onDestroy。

请注意,在活动的 onCreate() 中,它向服务发送广播,询问计数器的最新值,然后在视图中更新它。我找不到更好的方法让它们保持同步。

CounterService.java

public class CounterService extends Service {
    public static boolean RERUN = true;
    private int counter = 0;
    private SharedPreferences SP;
    private BroadcastReceiver mScreenStateBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                counter++;
                System.out.println("************************************* \n \n " + counter);
            }
            sendCounterBroadcast();
        }
    };

    public void sendCounterBroadcast() {
        Intent i = new Intent();
        i.setAction("com.inc.count");
        i.putExtra("counterValue", counter);
        sendBroadcast(i);

    }

    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("********************** CounterService.onCreate()");

        // get counter value from SP -- this is useful for when the service gets recreated
        SP = getSharedPreferences("Counter Service Data", MODE_PRIVATE);
        counter = SP.getInt("counter", 0);

        // wait for screen to be turned on or for the activity to ask you for the counter number
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_SCREEN_ON);
        intentFilter.addAction("send.counter.to.phonecounteractivity");
        registerReceiver(mScreenStateBroadcastReceiver, intentFilter);

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return Service.START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("***************************************** CounterService.OnDestroy()");
        unregisterReceiver(mScreenStateBroadcastReceiver);

        // Save counter value for when we restart service
        SP = getSharedPreferences("Counter Service Data", MODE_PRIVATE);
        SharedPreferences.Editor SPE = SP.edit();
        if (RERUN) {
            SPE.putInt("counter", counter);
            System.out.println("******************************** RESTARTING SERVICE ");
            startService(new Intent(getApplicationContext(), CounterService.class));
        } else
            SPE.putInt("counter", 0);
        SPE.apply();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

PhoneCheckerCounter.Java

public class PhoneCheckerCounter extends AppCompatActivity {
    private BroadcastReceiver changeCount;
    private IntentFilter filter;
    private int counter;

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

        switcherOnClick();
        assignValuesOnCreate();
        System.out.println("**************************** onCreate()");
        changeCounterText();

    }

    public void switcherOnClick() {
        final Switch sCounter = findViewById(R.id.switchCounter);
        sCounter.setOnClickListener(new View.OnClickListener() {
            Intent intent = new Intent(getApplicationContext(), CounterService.class);

            @Override
            public void onClick(View v) {
                if (sCounter.isChecked()) {
                    startService(intent);
                    CounterService.RERUN = true;
                    v.getContext().registerReceiver(changeCount, filter);
                    Toast.makeText(getApplicationContext(), "Counting has begun", Toast.LENGTH_SHORT).show();
                } else {
                    TextView n = findViewById(R.id.counter);
                    n.setText("0");
                    CounterService.RERUN = false;
                    v.getContext().unregisterReceiver(changeCount);
                    stopService(intent);
                    Toast.makeText(getApplicationContext(), "The application stopped counting", Toast.LENGTH_SHORT).show();
                }

            }
        });

    }

    public void changeCounterText() {
        changeCount = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                TextView n = findViewById(R.id.counter);
                counter = intent.getIntExtra("counterValue", 0);
                System.out.println("************************ RECEIVED!!!! value of: " + counter);
                n.setText("" + counter);
            }
        };

        filter = new IntentFilter();
        filter.addAction("com.inc.count");
        this.registerReceiver(changeCount, filter);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(changeCount);
        assignValuesOnDestroy();
        System.out.println("**************************** onDestroy()");
    }

    public void assignValuesOnCreate() {
        Switch s = findViewById(R.id.switchCounter);
        if (getSwitchValueFromSP() == 1) s.setChecked(true);
        else s.setChecked(false);

        Intent f = new Intent();
        f.setAction("send.counter.to.phonecounteractivity");
        sendBroadcast(f);

    }

    public void assignValuesOnDestroy() {
        SharedPreferences SP = getSharedPreferences("data", MODE_PRIVATE);
        SharedPreferences.Editor edit = SP.edit();
        Switch s = findViewById(R.id.switchCounter);
        if (s.isChecked()) edit.putInt("switch", 1);
        else edit.putInt("switch", 0);
        edit.apply();
    }


    public int getSwitchValueFromSP() {
        SharedPreferences SP = getSharedPreferences("data", MODE_PRIVATE);
        int isOn = SP.getInt("switch", 0);
        return isOn;
    }
}

活动样本

4

0 回答 0