質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

2772閲覧

androidでの変数保持

chinpanpan

総合スコア28

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

1クリップ

投稿2019/09/04 04:57

前提・実現したいこと

生成したクラスや変数を保持し続けたいです

発生している問題・エラーメッセージ

しばらく時間が立つと勝手に初期化されてしまう

該当のソースコード

public class clsGlobal extends Application {
private clsData1 data1 = new clsData1();
private String str;

/** * アプリケーションの起動時に呼び出される */ @Override public void onCreate() { super.onCreate(); } /** * アプリケーション終了時に呼び出される */ @Override public void onTerminate() { super.onTerminate(); } public clsData1 getData1() { return data1; } public void setData1(clsData1 _data1) { this.data1 = _data1; } public String getStr() { return str; } public void setData1(String _str) { this.str = _str; }

}

マニフェストファイル内
<application android:allowBackup="true" android:icon="@drawable/app_icon" android:label="テスト" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:name="clsGlobal" tools:replace="android:label">

試したこと

色々調べ、アンドロイドは基本的に構造的にいつどこでactivityや変数が消えるかわからないということがわかりました
SharedPreferencesを使うと保持し続けることはわかったのですが、それだと簡単な数値等しか保持できません
そこでグローバル変数としてextends Applicationに入れてみたのですが
やはり長時間スリープ等で勝手に初期化されてしまいます

グローバル変数も他の変数同様に勝手に消えるものなのでしょうか?
また、消えない変数やクラスを生成というのはできないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

SharedPreferencesを使うと保持し続けることはわかったのですが、それだと簡単な数値等しか保持できません

保存するのは変数なんでしょうか、

あるいはデータなんでしょうか
大量のデータならば
SQLiteなどのデータベースを使うか

FileOutputStream, FileInputStream
を使って内部ストレージに保存して読みだすなどでできそうですが

投稿2019/09/06 04:26

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chinpanpan

2019/09/09 00:36

遅くなりまして申し訳ありません intやbool、後は下のような簡単なクラスだったり 他にもサーバーへの接続を持ち続けるクラスなんてのがあります public class clsUsers implements Serializable { public long UsersNo = 0; public String ID = ""; public String Password = ""; public String Name = ""; }
aja

2019/09/09 04:54

>下のような簡単なクラス 構成からするとデータベースがいいような感じですが >サーバーへの接続を持ち続ける もしかするとバックグラウンドでサーバーとやり取りしてDozeで切れてしまうとか、それが問題なんでしょうか バックグラウンドで生き続けるためには、例えば startForegroundServiceを使ってフォアグラウンドにいるようにしていく方法があります また、ある程度長いデータを保持したいのであれば、txtファイルにまとめて外部、あるいは内部ストレージに保存する方法があります 定期的にアラームなどでバックグラウンドから起きてサーバーにアクセスするとか、もちろんDozeを回避しないとできませんが
chinpanpan

2019/09/09 07:24

Dozeはオフにしていました 定期的に起こすというのは気づきませんでした ちょっとその方向性で試してみます ありがとうございました
guest

0

Androidに限りませんが、ほとんどの計算機のプログラムはメモリ上に置かれたデータとコードをつ使って実行されます。
メモリは電源供給が途切れればデータを失いますし、実行を終えたactivityが確保していたメモリ領域は空きメモリ領域として扱われる事でデータにはアクセスできなくなります。

「消えない変数やクラス」を実現するには、
・プログラムの終了の際に、SDカード等の記憶装置にクラスの定義とデータを保存し、
・プログラムの再起動時にSDカード等の記憶装置に保存された情報に基づいて、クラスやデータをメモリ上に再現する
というような操作が必要になります。

投稿2019/09/04 06:10

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chinpanpan

2019/09/04 06:32

返信どうもありがとうございます アプリ自体はずっと起動しっぱなしを想定しています activityに変数やクラスをもたせるとactivityの消滅と同様に消えることがわかったので extends applicationに持たせてみたのです doze無効化等も色々とやってみたのですが どうしてもどこかで初期化されてしまい困っています PowerManager powerManager = getSystemService(PowerManager.class); if (!powerManager.isIgnoringBatteryOptimizations(getPackageName())) { Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問