4

X 分または X 時間ごとに Web サイトをチェックし、データが利用可能になったときに通知を提供する Palm OS アプリを作成しようとしています。この種のことが新しい Palm で実行できることは知っています。たとえば、私の Centro では、アプリケーションがトップにないときに電子メールや Web サイトをダウンロードできますが、その方法はわかりません。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

7

これは可能ですが、非常に困難です。いくつかの手順を実行する必要があります。

まず第一に、これは Palm OS 5 でのみ機能し、初期の Palm OS 5 デバイスの一部では大ざっぱです。最新のデバイスは優れていますが、完璧ではありません。

次に、AlmSetAlarm を使用してアプリケーションのアラームを作成する必要があります。これが、「X分またはX時間ごと」の部分を達成する方法です。

アラームが発生すると、アプリケーションがまだ実行されていなくても、sysAppLaunchCmdAlarmTriggered 起動コードを取得します。シンプルかつ迅速に何かを実行したい場合は、起動コードに応答して実行でき、完了です。

アラーム起動コードで作業を行った後、引き続き呼び出されるように次のアラームを設定してください。

重要な注意事項: この起動コードに応答するときは、グローバル変数にアクセスできません! コンパイラの設定によっては、仮想関数 (内部でグローバル変数を使用する) などの特定の C++ 機能にもアクセスできない可能性があります。これに役立つ Codewarrior で設定できる設定がありますが、私はあまり詳しくありません。グローバルを必要としないようにコードを設計する必要があります。たとえば、FtrSet と FtrGet を使用して、必要なグローバル データの一部を格納できます。最後に、68000 マシン コードの単一の 64KB コード セグメントにしかアクセスできません。グローバルが設定されていないと、セグメント間のジャンプが正しく機能しません。

コードの大部分を PNOlet に移動することで、これらの制限の多くを回避できますが、それはまったく別のより複雑なトピックです。

時間がかかる可能性のあるより複雑なこと (ウェブページの読み込みや電子メールのダウンロードなど) を実行したい場合は、アラーム起動コード中に実行しないことを強くお勧めします。sysAppLaunchCmdDisplayAlarm 起動コードで何かを実行し、ユーザーがキャンセルできるようにフォームを表示できます。しかし、これはすぐに煩わしくなります。

バックグラウンド アプリケーションになると、ユーザー エクスペリエンスが向上します (ただし、はるかに複雑になります)。これはちょっとした黒魔術であり、あまりサポートされていませんが、可能です。バックグラウンド アプリケーションになるには、基本的に次の 3 つの手順があります。

  1. DmDatabaseProtect を使用してアプリケーション データベースを保護します。これにより、アプリケーションがロックダウンされ、削除できなくなります。

  2. MemHandleLock と MemHandleSetOwner を使用してコード セグメントをロックします (所有者を 0 に設定します)。これにより、コードがメモリに読み込まれ、移動されなくなります。

  3. いくつかの通知に登録します。たとえば、sysNotifyIdleTimeEvent は、定期的なバックグラウンド処理を行うために使用する優れた通知です。

これを設定したら、アラーム起動コードを終了して、通知が発生するのを待つことができます。その後、通知ハンドラが呼び出されたときにすべてのバックグラウンド処理を行います。

また、システム オブジェクト (メモリ、ハンドル、ファイル ハンドルなど) を割り当てる場合、通知ハンドラーから戻った後もそれらが保持されると予想される場合は、それらの所有者を 0 (システム) に設定してください。それ以外の場合、システムはそれらをクリーンアップします。これを行う場合は、メモリとリソースのリークを避けるために細心の注意を払ってください!! 所有者が 0 に設定されている場合、それらは決してクリーンアップされません!

バックグラウンド モードを終了するには、逆の手順を実行します。通知の登録を解除し、コード セグメントのロックを解除して、アプリケーション データベースの保護を解除します。

バックグラウンドでネットワーク操作を行う場合は、必ずソケットをノンブロッキング モードに設定し、正しく処理してください。そうしないと、フォアグラウンド アプリケーションがブロックされ、問題が発生します。

于 2008-09-11T04:37:39.507 に答える