活动生命周期 - 保持一天中随机生成的图像

时间:2017-11-18 23:44:14

标签: android android-activity android-notifications

我正在尝试创建一个非常简单的Android应用程序,这本来是一个'书呆子'的生日礼物,但只剩下几天才能完成它并且完全没有这样做的经验,所以我想我会问。我几乎在编码内容方面,但在最后一个障碍时真的很困惑。

应用程序应执行以下操作:它应每24小时发出一张新照片等待的通知,并且应从数据库中随机选择新照片(文件夹drawables中的图像)。点击通知后,用户应该被带到新随机选择的照片。 至关重要的是,后续访问应用程序的全天应该会看到相同的图片,这样用户就不能“欺骗”应用程序一次性显示完整的图像数据库。这个特殊功能真的引起了头痛。目前我构建代码的方式如下:我有一个非常简单的MainActivity,其中只有一个按钮。单击该按钮每24小时触发一次通知。通知链接到不同的活动Repeating_activity,在您输入时生成随机图像。这是代码:

public class MainActivity extends AppCompatActivity {

Button button2a;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    button2a = (Button) findViewById(R.id.button2);


     button2a.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY,17);
            calendar.set(Calendar.MINUTE,35);
            Intent intent = new Intent(getApplicationContext(),NotificationReciever.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),100,intent,PendingIntent.FLAG_UPDATE_CURRENT);
            AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),alarmManager.INTERVAL_DAY,pendingIntent);
        }
    });
}
}

然后

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

    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    Intent repeating_intent = new Intent(context,Repeating_activity.class);
    repeating_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(context,100,repeating_intent,PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context,"lala")
            .setSmallIcon(android.R.drawable.arrow_up_float)
            .setContentIntent(pendingIntent)
            .setContentText("New photo awaits!")
            .setContentTitle("New photo")
            .setAutoCancel(true);
    notificationManager.notify(100,builder.build());

}
}

最后

public class Repeating_activity extends AppCompatActivity{

ImageView imageView2;

Random r;

Integer[] images = {
        R.drawable.image_2,
        R.drawable.image_3,
        R.drawable.image_8,
};

int pickedImage = 0, lastPicked = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.repeating_activity);
    imageView2 = (ImageView) findViewById(R.id.imageView2);
    r = new Random();
    do {
        pickedImage = r.nextInt(images.length);
    } while (pickedImage == lastPicked);
    lastPicked = pickedImage;
    Picasso.with(getApplicationContext()).load(images[pickedImage]).fit().centerInside().into(imageView2);
    imageView2.setImageResource(images[pickedImage]);
}
}

通过一些标准的重新调整,例如AndroidManifest中的更改或引入Picasso以避免bitmaps和dpi的问题,这个东西或多或少有效(在模拟器和我的设备上测试)。也就是说,应用程序背后最基本的想法是:出现通知,这会导致显示数据库中的随机图片。在离开应用程序并回到它的同时,也可以在照片仍在显示的意义上工作。但是,只要我们终止应用程序或让它在后台运行足够长时间,它就会恢复为主要活动。此外,检查通知间隔只有几分钟,似乎有一个问题,即后续'天'显示相同的图像(这可能是由于代码中的一些错误?)。

我已经开始阅读活动的生命周期和相应的不同状态,以及我们如何在应用程序终止时检索数据“丢失”(以及通常如何自动完成?)。但正如我所说,这是一个有趣的一次性小项目,所以试图掌握所有看起来有点过分的东西。

回想起来,我也意识到最好不要引入第二项活动。我想最好的方法是从主要活动开始,包括一张固定照片(例如欢迎图片)和底部的按钮。单击按钮会开始每24小时显示一次通知,然后每次出现通知时,它都应链接到主活动,但也会将显示的图像更改为新活动。现在应该保存MainActivity的新状态,以便在终止应用程序后重新输入应用仍然会导致看到随机生成的“当天图像”。

再过几天试图发现自己如何做到这将是非常有趣的,但我没有太多时间,所以任何特别的帮助将不胜感激!将此代码调整为实际上述功能的最快方法是什么?谢谢!

0 个答案:

没有答案