Pixel 7/7 Pro を購入するときの iPhone/Pixel シリーズ下取り価格一覧 (2022-10-08 18:00 現在)

1世代前のPixel 3が¥11,924 – ¥15,000、1世代先のPixel 5が¥49,805 – ¥61,500、Pixel 6およびPixel 6 Proが¥42,431 – ¥61,500で、最低額が最も高く設定されているのが3年前に発売された機種というあまりにも不自然な値段設定です。

👉 Pixel 7発売でPixel 4の下取り額が最大61,500円に爆上げ。中古スマホ店やメルカリから姿を消す hatena-bookmark


iPhone 6           ¥7,108 -  ¥9,380
iPhone 6 Plus      ¥7,176 - ¥10,100
iPhone 6S          ¥6,244 - ¥12,260
iPhone 6S Plus     ¥7,522 - ¥12,550
iPhone 7           ¥8,584 - ¥13,650
iPhone 7 Plus     ¥10,298 - ¥18,600
iPhone 8           ¥8,703 - ¥19,800
iPhone 8 Plus     ¥12,962 - ¥24,816
iPhone SE          ¥5,767 -  ¥9,250
iPhone SE2        ¥21,906 - ¥35,000
iPhone X          ¥12,072 - ¥25,900
iPhone XR         ¥14,614 - ¥29,202
iPhone XS         ¥14,357 - ¥33,600
iPhone XS Max     ¥22,351 - ¥40,600
iPhone 11         ¥41,885 - ¥61,500 *
iPhone 11 Pro     ¥36,876 - ¥61,500
iPhone 11 Pro Max ¥30,124 - ¥63,558
iPhone 12         ¥38,045 - ¥61,500
iPhone 12 Mini    ¥41,033 - ¥61,500
iPhone 12 Pro     ¥40,421 - ¥74,745
iPhone 12 Pro Max ¥46,777 - ¥84,915


Pixel          ¥6,469 -  ¥8,000
Pixel XL       ¥6,469 -  ¥8,000
Pixel 2        ¥5,903 -  ¥8,000
Pixel 2 XL     ¥5,165 -  ¥8,000
Pixel 3       ¥11,924 - ¥15,000
Pixel 3 XL    ¥11,211 - ¥15,000
Pixel 3a      ¥18,174 - ¥22,000
Pixel 3a XL   ¥17,462 - ¥22,000 
Pixel 4       ¥53,809 - ¥61,500 *
Pixel 4 XL    ¥52,347 - ¥61,500
Pixel 4a       ¥8,765 - ¥17,600
Pixel 4a 5G    ¥9,401 - ¥17,600
Pixel 5       ¥49,805 - ¥61,500
Pixel 5a (5G) ¥14,284 - ¥35,768
Pixel 6       ¥42,431 - ¥61,500
Pixel 6 Pro   ¥42,431 - ¥61,500

Pixel7-iPhone11
👉 Google Pixel 7 - Google ストア hatena-bookmark

このチャンスを見逃すな?!



👉 最新 Android Pixel7 端末をお得に購入するための3つのこと。 hatena-bookmark
👉 軽くて小さくて新しいスマホを買いたい iPhone14 vs Pixel7 hatena-bookmark


軽くて小さくて新しいスマホを買いたい iPhone14 vs Pixel7

悩む。

こまごまとした仕様の差はどうでもいい。

カメラもあんまり気にしない。

サイズと重さと価格。

 

■ iPhone14 128GB

x 価格 119,800円
o 重量 172g
o サイズ 146.7x71.5x7.8
x ディスプレイ 6.1インチ
x バッテリー 3,279mAh, MagSafeおよびQiワイヤレス充電

iPhone14
👉 iPhone 14とiPhone 14 Plus - Apple(日本) hatena-bookmark

 

■ Pixel7 128GB

o 価格 82,500円
x 重量 197g
x サイズ 155.6x73.2x8.7
o ディスプレイ 6.3インチ
o バッテリー 4,355 mAh, 急速ワイヤレス充電

Pixel7

👉 Google Pixel 7 の技術仕様 - Google ストア hatena-bookmark

 

■ まとめ

10万円を超えるスマホとかパソコンユーザーはいらなくね?

「iPhone は重い」というイメージが崩れた。

もう少し考えることにします。


【Jetpack Compose】NavBackStackEntry - Composable のライフサイクルと ViewModel の状態を確認する

NavBackStackEntry Lifecylecle State

 

■ きっかけ

普通に、トップレベルの Composable内で State/Flow/StateFlow を返す ViewModel に接続します。


Composable ↔ ViewModel (↔ Repository)

👉 Hilt と Navigation

一般的な NavHostController を使う場合には、それは NavBackStackEntryインスタンス となり 一つの Activity の上にスタック上に積まれていく。

👉 Composable の LifecycleOwner は誰なのか - collectAsStateWithLifecycle


NavBackStackEntry3 - Composable3 ↔ ViewModel3 
NavBackStackEntry2 - Composable2 ↔ ViewModel2
NavBackStackEntry1 - Composable1 ↔ ViewModel1
Activity

ライフサイクル上、Activity と NavBackStackEntry との関係は良さそうです。

外側のActivityやFragmentがonStop状態になっていればこのNavBackStackEntryのlifecycleはCREATED状態になってくれていそうにみえます。

👉 ComposeNavigationで使えるNavBackStackEntryのlifecycleとは?
👉 NavBackStackEntryのLifecycleについて | by Kenji Abe | Medium

Flow を扱う ViewModel と、

スタックされる NavBackStackEntry (Screen-Level Composable) のライフサイクル。

気になります。

目視したいです。

遷移によっては同じ Composable がスタックに積まれていくのもキモいし。

 

■ 方法

ViewModel の生き死には、


class TodoViewModel @Inject constructor(
) : ViewModel() {

  init {
    // log
  }

  override fun onCleared() {
    // log
  }

}

で確認します。

👉 ViewModel はいつ生まれていつ死ぬか 【→ Jetpack Compose】

Composable - NavBackStackEntry のライフサイクルは、


LifecycleEventObserver { _, event ->
  // log event
}

を使います。hash 付けてます。

👉 DisposableEffect: クリーンアップが必要な作用

遷移先となる Composale に貼ります。


@Composable
fun TodoScreen(
  viewModel: TodoViewModel = hiltViewModel()
) {

  LocalLifecycleStateLogger(" TodoScreen") // *


@Composable
fun PokeScreen(
  viewModel: TodoViewModel = hiltViewModel()
) {

  LocalLifecycleStateLogger(" PokeScreen") // *

ついでに、これらの親となる NavHostController をセットしている Composale にも貼ります。


@Composable
fun MainScreen() {
  SystemUi(rememberSystemUiController())

  LocalLifecycleStateLogger(screenName = "MainScreen") // *

  val navHostController = rememberNavController()

 

■ 結果

BottomNavigation をつかっていますが、スタックや saveState の設定はデフォルトのままなので、navigation を使っている場合は同様ではないかと思います。


アプリ起動

  ↓ ① click

TodoScreen

  ↓ ② click

PokeScreen

  ↓ ③ click

TodoScreen

  ↓ ④ back

PokeScreen

  ↓ ⑤ back

TodoScreen

  ↓ ⑥ back

アプリ終了



ログ出力結果。


D: @@@ MainScreen - MainActivity@a542ab9 -> ON_CREATE
D: @@@ MainScreen - MainActivity@a542ab9 -> ON_START
D: @@@ MainScreen - MainActivity@a542ab9 -> ON_RESUME
D: @@@  TodoViewModel@abae21d initialized.
D: @@@  TodoScreen - NavBackStackEntry@8ad648d7 -> ON_CREATE
D: @@@  TodoScreen - NavBackStackEntry@8ad648d7 -> ON_START
D: @@@  TodoScreen - NavBackStackEntry@8ad648d7 -> ON_RESUME
D: @@@  TodoScreen - NavBackStackEntry@8ad648d7 -> ON_PAUSE
D: @@@  TodoScreen - NavBackStackEntry@8ad648d7 -> ON_STOP
D: @@@  PokeViewModel@ad0cefd initialized.
D: @@@  PokeScreen - NavBackStackEntry@4049e1c3 -> ON_CREATE
D: @@@  PokeScreen - NavBackStackEntry@4049e1c3 -> ON_START
D: @@@  PokeScreen - NavBackStackEntry@4049e1c3 -> ON_RESUME
D: @@@  PokeScreen - NavBackStackEntry@4049e1c3 -> ON_PAUSE
D: @@@  PokeScreen - NavBackStackEntry@4049e1c3 -> ON_STOP
D: @@@  TodoViewModel@577b5b1 initialized.
D: @@@  TodoScreen - NavBackStackEntry@f1d51055 -> ON_CREATE
D: @@@  TodoScreen - NavBackStackEntry@f1d51055 -> ON_START
D: @@@  TodoScreen - NavBackStackEntry@f1d51055 -> ON_RESUME
D: @@@  TodoScreen - NavBackStackEntry@f1d51055 -> ON_PAUSE
D: @@@  TodoScreen - NavBackStackEntry@f1d51055 -> ON_STOP
D: @@@  PokeScreen - NavBackStackEntry@4049e1c3 -> ON_CREATE
D: @@@  PokeScreen - NavBackStackEntry@4049e1c3 -> ON_START
D: @@@  TodoScreen - NavBackStackEntry@f1d51055 -> ON_DESTROY
D: @@@  TodoViewModel@577b5b1 onCleared.
D: @@@  PokeScreen - NavBackStackEntry@4049e1c3 -> ON_RESUME
D: @@@  PokeScreen - NavBackStackEntry@4049e1c3 -> ON_PAUSE
D: @@@  PokeScreen - NavBackStackEntry@4049e1c3 -> ON_STOP
D: @@@  TodoScreen - NavBackStackEntry@8ad648d7 -> ON_CREATE
D: @@@  TodoScreen - NavBackStackEntry@8ad648d7 -> ON_START
D: @@@  PokeScreen - NavBackStackEntry@4049e1c3 -> ON_DESTROY
D: @@@  PokeViewModel@ad0cefd onCleared.
D: @@@  TodoScreen - NavBackStackEntry@8ad648d7 -> ON_RESUME
D: @@@  TodoScreen - NavBackStackEntry@8ad648d7 -> ON_PAUSE
D: @@@ MainScreen - MainActivity@a542ab9 -> ON_PAUSE
D: @@@  TodoScreen - NavBackStackEntry@8ad648d7 -> ON_STOP
D: @@@ MainScreen - MainActivity@a542ab9 -> ON_STOP

ログから 各Screen = NavBackStackEntry のスタック状態を考えます。


  -

  ↓ ① click

 TodoScreen1 ↔ TodoViewModel1
MainScreen1 - MainActivity

  ↓ ② click

 PokeScreen1 ↔ PokeViewModel1
 TodoScreen1 ↔ TodoViewModel1
MainScreen1 - MainActivity

  ↓ ③ click

 TodoScreen2 ↔ TodoViewModel2
 PokeScreen1 ↔ PokeViewModel1
 TodoScreen1 ↔ TodoViewModel1
MainScreen@1 - MainActivity

  ↓ ④ back

 PokeScreen1 ↔ TodoViewModel2
 TodoScreen1 ↔ TodoViewModel1
MainScreen1 - MainActivity

  ↓ ⑤ back

 TodoScreen1 ↔ TodoViewModel1
MainScreen1 - MainActivity

  ↓ ⑥ back

  -

それぞれの NavBackStackEntry のライフサイクルと ViewModel の状態が確認できました。

ホストの Composable のライフサイクルオーナーは、Activity であることも分かりました。

画面が遷移していくと、NavBackStackEntry はスタックされていき、 back (戻る操作) すると、NavBackStackEntry は ON_DESTROY され、スタックから取り除くかれ、それに対応する ViewModel も onCleard() されていきます。

なんとなく思うのは、今現在としては、ViewModel は、やっぱりあったほうがいいように思います。

👉 【Jetpack Compose】 ViewModel を捨てて Repository を Composable に直結する

そのうち、


hiltViewModel<ViewModel>()

のように、Reposiitory や DataProvider を注入する

androidx.hilt.navigation.compose メソッドやアノテーションが出れば嬉しいです。


👉 Jetpack Compose without ViewModel / Twitter hatena-bookmark

👉 Jim Sproch (@JimSproch) - Jetpack Composeのコンポーネントはなぜ返り値がないのか - Blog - Mori Atsushi hatena-bookmark

もうこれは「UIもマルチスレッドな時代になった」と言っていいんすかね。

👉 User interface frameworks typically are single-threaded. Why is this so and what are the performance implications of this single-threading? - Quora hatena-bookmark
👉 Are Multiple UI Threads Possible? | Apple Developer Forums hatena-bookmark

(つづく...)