如何在 Android 中组织代码

How to organising your code in Android

如何组织我的代码?我试图将所有内容都放在不同的包中,但是我的 GCM 通知不再有效。如果我把所有东西都放在同一个根包里没问题。

这是我的两个测试,左边在 gcm 上有问题,右边没有:

有没有什么方法可以像我在正确的方法中那样轻松组织代码?还是所有 classes、活动、服务都需要放在同一个包中?

编辑 1 = 解决方案

您需要创建自己的 class 来扩展 GCMBroadcastReceiver,如下所示:

import android.content.Context;

import com.google.android.gcm.GCMBroadcastReceiver;

public class GCMReceiver extends GCMBroadcastReceiver{
    @Override
    protected String getGCMIntentServiceClassName(Context context) {
        return "yourAppPackage.yourNewAddedPackage.GCMIntentService";
    }
}

然后你需要将清单中的默认接收者更改为这个class所在的包。例如:

<receiver android:name="yourPackage.PackageOfTheGCMReceiver.GCMReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="be.vanlooverenkoen.piautomation" />
            </intent-filter>
        </receiver>

如果您想组织代码,可以选择以下模式:MVC,关于是否 Android 使用默认 MVC 存在很大争议。

但是我在你的结构中看到了你的图片,你想要一个关于 .java 文件的推荐。 我给出了以下我在不同文件、书籍和 github 存储库中看到的建议(包按字母顺序排列):

活动

适配器

验证者

数据

data.migrations

碎片

帮手

接口

型号

首选项

同步

您需要创建自己的 class 来扩展 GCMBroadcastReceiver,如下所示:

import android.content.Context;

import com.google.android.gcm.GCMBroadcastReceiver;

public class GCMReceiver extends GCMBroadcastReceiver{
    @Override
    protected String getGCMIntentServiceClassName(Context context) {
        return "yourAppPackage.yourNewAddedPackage.GCMIntentService";
    }
}

然后你需要将清单中的默认接收者更改为这个class所在的包。例如:

<receiver android:name="yourPackage.PackageOfTheGCMReceiver.GCMReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="be.vanlooverenkoen.piautomation" />
            </intent-filter>
        </receiver>