アプリを終了して再起動すると、例外が発生します。
public void onCreate() {
-->here Parse.initialize(this, "adfsfasdfs",
"asdfadfsdf");
ParseInstallation.getCurrentInstallation().saveInBackground();
ParseInstallation.create(identity == null ? "No Identity Set"
: identity);
例外
07-08 23:27:29.411: E/AndroidRuntime(4889): Caused by: Java.lang.IllegalStateException: ParsePlugins is already initialized
07-08 23:27:29.411: E/AndroidRuntime(4889): at com.parse.ParsePlugins.set(ParsePlugins.Java:27)
07-08 23:27:29.411: E/AndroidRuntime(4889): at com.parse.ParsePlugins.access$200(ParsePlugins.Java:11)
07-08 23:27:29.411: E/AndroidRuntime(4889): at com.parse.ParsePlugins$Android.initialize(ParsePlugins.Java:141)
07-08 23:27:29.411: E/AndroidRuntime(4889): at com.parse.Parse.initialize(Parse.Java:178)
07-08 23:27:29.411: E/AndroidRuntime(4889): at com.mcruiseon.caregiri.Registration.onCreate(Registration.Java:98)
マニフェストファイル
<service Android:name="com.parse.PushService" />
<receiver Android:name="com.parse.ParseBroadcastReceiver" >
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED" />
<action Android:name="Android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<receiver
Android:name="com.parse.ParsePushBroadcastReceiver"
Android:exported="false" >
<intent-filter>
<action Android:name="com.parse.Push.intent.RECEIVE" />
<action Android:name="com.parse.Push.intent.DELETE" />
<action Android:name="com.parse.Push.intent.OPEN" />
</intent-filter>
</receiver>
編集:
なぜParseがこれに対して例外をスローするのだろうか。 info
だけで先に進んでみませんか。初期化されているので、もう一度初期化すると大したことです。
解決策
私はParseをあきらめました。アプリケーションの方法は好きではありません。維持するのが面倒です。
Parse.initialize()
は、アプリケーション全体で1回だけ呼び出す必要があります。
Activity
のonCreate
関数で呼び出すと、アプリのライフサイクル中にアクティビティが複数回作成される可能性があるため、複数回初期化される可能性があります。
代わりに、アプリケーションクラスを作成します(そして、アプリケーションのマニフェストにAndroid:name
属性を追加します)。
アプリケーション:(アクティビティ/サービス/受信者ではないことに注意してください)
//Note that this is an Android.app.Application class.
public class MyApplication extends Android.app.Application {
@Override
public void onCreate() {
super.onCreate();
//This will only be called once in your app's entire lifecycle.
Parse.initialize(this,
getResources().getString(R.string.parse_application_id),
getResources().getString(R.string.parse_client_key));
}
AndroidManifest:
<application
Android:name=".MyApplication">
....
<activity>
....
</activity>
</application>
決して気にしないで、私はそれを修正しました。問題は構文エラーが原因でした。解決のためにすべてに感謝します。
私は与えられたものに従ったのでこれは奇妙ですが、今はプッシュ通知をまったく受け取っていませんか?私が行った唯一の変更:
マニフェスト
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme"
Android:name="full.package.name.UseParse" >
アプリケーションクラス
public class UseParse extends Android.app.Application {
@Override
public void onCreate() {
super.onCreate();
Parse.initialize(this, "id", "key");
ParseInstallation.getCurrentInstallation().saveInBackground();
}
自分で初期化を確認し、例外を処理するだけで、エラーによってアプリがクラッシュすることはなく、静かに例外がスローされます。
try {
Parse.initialize(this);
parseinited = true;
}
catch (IllegalStateException e) {
e.printStackTrace();
}
ブール値を使用して解決しましたisParseInitialized変数。方向の変更、つまり同じアプリケーションセッションでアクティビティが再作成されたときに機能します。コードスニペット :
public class YourActivity extends Activity {
private static boolean isParseInitialized = false;
public static final String APPLICATION_ID = "your_application_id";
public static final String CLIENT_KEY = "your_client_key";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_youractivity);
if(isParseInitialized==false) {
Parse.initialize(this, APPLICATION_ID, CLIENT_KEY);
isParseInitialized = true;
}
..........
}
これは解決策です
public class MainActivity extends AppCompatActivity {
static boolean parseIsInit = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!parseIsInit){
Log.d("demo",""+parseIsInit );
Parse.initialize(this, "PutHereYourKeys", "PutHereYourKeys");
parseIsInit=true;
}
ParseInstallation.getCurrentInstallation().saveInBackground();
}
}