0

在测试此应用程序时,我不断收到强制关闭错误。应用程序打开正常.. 但 3-4 秒后强制关闭错误对话框出现。包括代码。任何帮助将不胜感激。谢谢

显现

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cy.headset"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <receiver android:name=".Main" >
        <intent-filter>
            <action android:name="android.content.Intent.ACTION_BATTERY_CHANGED" />
        </intent-filter>
    </receiver>

    <activity
        android:name="com.cy.headset.Main"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Java 代码

package com.cy.headset;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class Main extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent i) {

    Toast.makeText(context, "Headphone connected", Toast.LENGTH_LONG).show();

}}

XML 用户界面文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Main" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_margin="10dp"
    android:layout_marginTop="151dp"
    android:text="@string/hello_world"
    android:textAlignment="center" />

4

3 回答 3

1

什么是 Main.java 的 BroadcastReceiver 类的包?

<receiver android:name=".Main" >
    <intent-filter>
        <action android:name="android.content.Intent.ACTION_BATTERY_CHANGED" />
    </intent-filter>
</receiver>

应该不是com.cy.headset吧?因为这将与您的主要活动发生冲突,即 Main.java

我认为有两种解决方案在清单中指定接收器的包。

例子:

<receiver android:name="com.package.name.Main" >
    <intent-filter>
        <action android:name="android.content.Intent.ACTION_BATTERY_CHANGED" />
    </intent-filter>
</receiver>

或者,如果您希望您的接收器与 Main.java 的主要活动位于同一包中,请重命名您的接收器

例子:

<receiver android:name=".BatteryChange" >
    <intent-filter>
        <action android:name="android.content.Intent.ACTION_BATTERY_CHANGED" />
    </intent-filter>
</receiver>

<activity
    android:name="com.cy.headset.Main"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

另一种方法是。

<receiver android:name="com.cy.headset.BatteryChange" >
    <intent-filter>
        <action android:name="android.content.Intent.ACTION_BATTERY_CHANGED" />
    </intent-filter>
</receiver>

<activity
    android:name="com.cy.headset.Main"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
于 2013-02-22T20:06:23.820 回答
0

您将ActivityBroadcastReceiver都声明为com.cy.headset.Main。这是行不通的。

安装您的应用后,Android 会尝试启动一个名为 的 Activity Main,但会找到一个 BroadcastReceiver。

将它们分成两个不同的类,一个扩展 Activity,一个扩展 BroadcastReceiver。

于 2013-02-22T17:04:04.340 回答
0
<receiver android:name=".Main" >
    <intent-filter>
        <action android:name="android.content.Intent.ACTION_BATTERY_CHANGED" />
    </intent-filter>
</receiver>

<activity
    android:name="com.cy.headset.MainActivity" <<Change it to MainActivity
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

您已经定义了相同的接收器和活动名称,并且两者都在同一个包com.cy.headset中,因此重命名一个或在不同的包中定义并给出完全限定的包名称。

例如:如果接收器在com.cv.headset.receiver中,则在清单中写入

<receiver android:name="com.cv.headset.receiver.Main" >
    <intent-filter>
        <action android:name="android.content.Intent.ACTION_BATTERY_CHANGED" />
    </intent-filter>
</receiver>
于 2013-02-22T17:06:19.457 回答