Android - Возобновление состояния приложения - SL4A
Пожалуйста, не гарпируйте меня на вопрос новичка.
Я работаю над приложением для Android, использующим SL4A, когда мое приложение запускается в фоновом режиме, пока выполняется скрипт. Я не уверен, с чего начать, но каждый раз, когда я нажимаю свой значок, он перезапускает мое приложение. Я пробовал использовать разные режимы запуска, и ничего другого не происходило. Я думаю, что это связано с кодом OnCreate и настройкой уведомления. Мне нужна помощь, чтобы сохранить состояние моего приложения и затем возобновить его, либо повторно щелкнув значок, либо щелкнув значок на панели уведомлений. Я перепробовал все, чтобы обратиться сюда за помощью. Я не профессионал в программировании Android любыми средствами. Спасибо, ребята, будьте нежны;)
Public void onCreate() {
super.onCreate();
mInterpreterConfiguration = ((BaseApplication) getApplication())
.getInterpreterConfiguration();
}
@Override
public void onStart(Intent intent, final int startId) {
super.onStart(intent, startId);
String fileName = Script.getFileName(this);
Interpreter interpreter = mInterpreterConfiguration
.getInterpreterForScript(fileName);
if (interpreter == null || !interpreter.isInstalled()) {
mLatch.countDown();
if (FeaturedInterpreters.isSupported(fileName)) {
Intent i = new Intent(this, DialogActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra(Constants.EXTRA_SCRIPT_PATH, fileName);
startActivity(i);
} else {
Log
.e(this, "Cannot find an interpreter for script "
+ fileName);
}
stopSelf(startId);
return;
}
// Copies script to internal memory.
fileName = InterpreterUtils.getInterpreterRoot(this).getAbsolutePath()
+ "/" + fileName;
File script = new File(fileName);
// TODO(raaar): Check size here!
if (!script.exists()) {
script = FileUtils.copyFromStream(fileName, getResources()
.openRawResource(Script.ID));
}
copyResourcesToLocal(); // Copy all resources
if (Script.getFileExtension(this)
.equals(HtmlInterpreter.HTML_EXTENSION)) {
HtmlActivityTask htmlTask = ScriptLauncher.launchHtmlScript(script,
this, intent, mInterpreterConfiguration);
mFacadeManager = htmlTask.getRpcReceiverManager();
mLatch.countDown();
stopSelf(startId);
} else {
mProxy = new AndroidProxy(this, null, true);
mProxy.startLocal();
mLatch.countDown();
ScriptLauncher.launchScript(script, mInterpreterConfiguration,
mProxy, new Runnable() {
@Override
public void run() {
mProxy.shutdown();
stopSelf(startId);
}
});
}
}
RpcReceiverManager getRpcReceiverManager() throws InterruptedException {
mLatch.await();
if (mFacadeManager==null) { // Facade manage may not be available on startup.
mFacadeManager = mProxy.getRpcReceiverManagerFactory()
.getRpcReceiverManagers().get(0);
}
return mFacadeManager;
}
@Override
protected Notification createNotification() {
Notification notification =
new Notification(R.drawable.script_logo_48, this.getString(R.string.loading), System.currentTimeMillis());
// This contentIntent is a noop.
PendingIntent contentIntent = PendingIntent.getService(this, 0, new Intent(), 0);
notification.setLatestEventInfo(this, this.getString(R.string.app_name), this.getString(R.string.loading), contentIntent);
notification.flags = Notification.FLAG_ONGOING_EVENT;
return notification;
}
2 ответа
У вас есть пара разных вопросов здесь. Во-первых, сценарий, выполняющий некоторую работу в вашем приложении, вероятно, не должен запускаться внутри Activity. Это потому, что вы, вероятно, не хотите, чтобы выполнение вашего скрипта было связано с жизненным циклом Acitivty. Я рекомендую проверить жизненный цикл Activity @ http://developer.android.com/reference/android/app/Activity.html
Я рекомендую использовать Сервис для контроля работы скрипта. Как утверждают документы
Сервис - это компонент приложения, представляющий либо желание приложения выполнить более продолжительную операцию, не взаимодействуя с пользователем, либо предоставить функциональность для использования другими приложениями.
Служба также обычно там, где вы хотите контролировать показ и отмену вашего уведомления. Что касается режимов запуска действий из намерения уведомления, это может усложниться, но обычно вы хотите убедиться, что запуск вашего действия из уведомления не приведет к созданию дублирующих действий. Посмотрите @ http://developer.android.com/guide/topics/ui/notifiers/notifications.html некоторые подробности об этом.
OnRestart будет запускать OnStart, поэтому каждый раз, когда вы перезапускаете приложение, скрипт запускается снова. Посетите http://www.androidjavadoc.com/1.0_r1_src/android/app/Activity.html для удобного жизненного цикла Android.
Интересно, что бы это было лучше реализовать как сервис с активностью, вызывающей сервис?