├── ic_launcher-web.png ├── libs └── android-support-v4.jar ├── res ├── drawable-hdpi │ └── ic_launcher.png ├── drawable-mdpi │ └── ic_launcher.png ├── drawable-xhdpi │ └── ic_launcher.png ├── drawable-xxhdpi │ └── ic_launcher.png ├── values-sw600dp │ └── dimens.xml ├── values │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── menu │ └── main.xml ├── values-sw720dp-land │ └── dimens.xml ├── values-v11 │ └── styles.xml ├── values-v14 │ └── styles.xml └── layout │ └── activity_main.xml ├── gen └── com │ └── example │ └── alwayson │ ├── BuildConfig.java │ └── R.java ├── src └── com │ └── example │ └── alwayson │ ├── service │ ├── BaseService.java │ ├── RebootBroadcastReceiver.java │ ├── AlarmBroadcastReceiver.java │ ├── AlwaysOnService.java │ └── Bootstrap.java │ ├── Constants.java │ └── MainActivity.java ├── .gitattributes ├── README.md ├── project.properties ├── proguard-project.txt ├── AndroidManifest.xml └── .gitignore /ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/ic_launcher-web.png -------------------------------------------------------------------------------- /libs/android-support-v4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/libs/android-support-v4.jar -------------------------------------------------------------------------------- /res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/henrylilei/AlwaysOn/HEAD/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /gen/com/example/alwayson/BuildConfig.java: -------------------------------------------------------------------------------- 1 | /** Automatically generated file. DO NOT MODIFY */ 2 | package com.example.alwayson; 3 | 4 | public final class BuildConfig { 5 | public final static boolean DEBUG = true; 6 | } -------------------------------------------------------------------------------- /res/values-sw600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16dp 5 | 16dp 6 | 7 | 8 | -------------------------------------------------------------------------------- /res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | AlwaysOn 5 | Settings 6 | Hello world! 7 | 8 | 9 | -------------------------------------------------------------------------------- /res/menu/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /res/values-sw720dp-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 128dp 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/com/example/alwayson/service/BaseService.java: -------------------------------------------------------------------------------- 1 | package com.example.alwayson.service; 2 | 3 | import android.app.Service; 4 | import android.content.Intent; 5 | import android.os.IBinder; 6 | 7 | public class BaseService extends Service { 8 | 9 | @Override 10 | public IBinder onBind(Intent arg0) { 11 | return null; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /res/values-v11/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /res/values-v14/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/com/example/alwayson/Constants.java: -------------------------------------------------------------------------------- 1 | package com.example.alwayson; 2 | 3 | public class Constants { 4 | public static final int ALARM_REPEAT_INTERVAL = 10; 5 | public static final String STARTUP_ACTION_NAME = "alwayson_startup_action_name"; 6 | 7 | public static final String SHAREDPREF_RUNNINGTIMECOUNT_STRING = "com.example.alwayson.runningtimecount"; 8 | public static final String SHAREDPREF_APP_STRING = "com.example.alwayson.sharedpref"; 9 | } 10 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | AlwaysOn 2 | ======== 3 | 4 | A template for how to resurrect/keeps running an Android service in the background even when the user kills the service. 5 | 6 | This template has the following four ways to revive the service, 7 | 8 | 1. User starts the app again. 9 | 2. User presses power key to turn on the screen. 10 | 3. User restarts the phone. 11 | 4. 10 seconds passed after anything/anyone kills our service. 12 | 13 | Here is a [detailed explanation](http://engineereverything.wordpress.com/2013/11/27/android-how-to-resurrectstay-in-the-background-even-the-user-kills-the-app/) on the project. 14 | -------------------------------------------------------------------------------- /project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system edit 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | # 10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): 11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 12 | 13 | # Project target. 14 | target=android-18 15 | -------------------------------------------------------------------------------- /res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/com/example/alwayson/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.alwayson; 2 | 3 | import com.example.alwayson.service.Bootstrap; 4 | 5 | import android.os.Bundle; 6 | import android.app.Activity; 7 | import android.view.Menu; 8 | 9 | public class MainActivity extends Activity { 10 | 11 | @Override 12 | protected void onCreate(Bundle savedInstanceState) { 13 | super.onCreate(savedInstanceState); 14 | setContentView(R.layout.activity_main); 15 | Bootstrap.startAlwaysOnService(this, "Main"); 16 | } 17 | 18 | @Override 19 | public boolean onCreateOptionsMenu(Menu menu) { 20 | // Inflate the menu; this adds items to the action bar if it is present. 21 | getMenuInflater().inflate(R.menu.main, menu); 22 | return true; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/com/example/alwayson/service/RebootBroadcastReceiver.java: -------------------------------------------------------------------------------- 1 | package com.example.alwayson.service; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.util.Log; 7 | 8 | public class RebootBroadcastReceiver extends BroadcastReceiver { 9 | private static final String LOG_TAG = RebootBroadcastReceiver.class.getSimpleName(); 10 | 11 | @Override 12 | public void onReceive(Context context, Intent intent) { 13 | Log.v(LOG_TAG, "onReceive"); 14 | 15 | if ((intent.getAction().equals(Intent.ACTION_USER_PRESENT)) 16 | || (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))) { 17 | Bootstrap.startAlwaysOnService(context, intent.getAction()); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 14 | 15 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /proguard-project.txt: -------------------------------------------------------------------------------- 1 | # To enable ProGuard in your project, edit project.properties 2 | # to define the proguard.config property as described in that file. 3 | # 4 | # Add project specific ProGuard rules here. 5 | # By default, the flags in this file are appended to flags specified 6 | # in ${sdk.dir}/tools/proguard/proguard-android.txt 7 | # You can edit the include path and order by changing the ProGuard 8 | # include property in project.properties. 9 | # 10 | # For more details, see 11 | # http://developer.android.com/guide/developing/tools/proguard.html 12 | 13 | # Add any project specific keep options here: 14 | 15 | # If your project uses WebView with JS, uncomment the following 16 | # and specify the fully qualified class name to the JavaScript interface 17 | # class: 18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 19 | # public *; 20 | #} 21 | -------------------------------------------------------------------------------- /src/com/example/alwayson/service/AlarmBroadcastReceiver.java: -------------------------------------------------------------------------------- 1 | package com.example.alwayson.service; 2 | 3 | import com.example.alwayson.Constants; 4 | 5 | import android.content.BroadcastReceiver; 6 | import android.content.Context; 7 | import android.content.Intent; 8 | 9 | public class AlarmBroadcastReceiver extends BroadcastReceiver { 10 | private static final String LOG_TAG = AlarmBroadcastReceiver.class.getSimpleName(); 11 | public static final String ACTION_CUSTOM_ALARM = "alwayson.alarm.action"; 12 | 13 | @Override 14 | public void onReceive(Context context, Intent intent) { 15 | if (intent.getAction().equals(AlarmBroadcastReceiver.ACTION_CUSTOM_ALARM)) { 16 | String previousAction = intent 17 | .getStringExtra(Constants.STARTUP_ACTION_NAME); 18 | if (previousAction == null || previousAction.length() == 0) { 19 | previousAction = intent.getAction(); 20 | } 21 | Bootstrap.startAlwaysOnService(context, previousAction); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 10 | 11 | 12 | 13 | 18 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /src/com/example/alwayson/service/AlwaysOnService.java: -------------------------------------------------------------------------------- 1 | package com.example.alwayson.service; 2 | 3 | import java.util.concurrent.Executors; 4 | import java.util.concurrent.ScheduledExecutorService; 5 | import java.util.concurrent.TimeUnit; 6 | 7 | import com.example.alwayson.Constants; 8 | 9 | import android.content.Context; 10 | import android.content.Intent; 11 | import android.content.SharedPreferences; 12 | import android.util.Log; 13 | 14 | public class AlwaysOnService extends BaseService { 15 | private static String LOG_TAG = AlwaysOnService.class.getSimpleName(); 16 | public static boolean isRunning = false; 17 | private ScheduledExecutorService backgroundService; 18 | 19 | @Override 20 | public int onStartCommand(Intent intent, int flags, int startId) { 21 | if (isRunning == false) { 22 | // run something 23 | backgroundService = Executors.newSingleThreadScheduledExecutor(); 24 | backgroundService.scheduleAtFixedRate(new TimerIncreasedRunnable( 25 | this), 0, 1000, TimeUnit.MILLISECONDS); 26 | isRunning = true; 27 | } 28 | // the following will return START_STICKY 29 | return super.onStartCommand(intent, flags, startId); 30 | } 31 | 32 | @Override 33 | public void onDestroy() { 34 | // stop running 35 | isRunning = false; 36 | backgroundService.shutdownNow(); 37 | super.onDestroy(); 38 | } 39 | 40 | public class TimerIncreasedRunnable implements Runnable { 41 | private SharedPreferences currentSharedPreferences; 42 | 43 | public TimerIncreasedRunnable(Context context) { 44 | this.currentSharedPreferences = context.getSharedPreferences( 45 | Constants.SHAREDPREF_APP_STRING, MODE_PRIVATE); 46 | } 47 | 48 | @Override 49 | public void run() { 50 | int timeCount = this.readTimeCount() + 1; 51 | this.writeTimeCount(timeCount); 52 | int currentEpochTimeInSeconds = (int) (System.currentTimeMillis() / 1000L); 53 | Log.v(LOG_TAG, "Count:" + timeCount + " at time:" 54 | + currentEpochTimeInSeconds); 55 | } 56 | 57 | private int readTimeCount() { 58 | return this.currentSharedPreferences.getInt( 59 | Constants.SHAREDPREF_RUNNINGTIMECOUNT_STRING, 0); 60 | } 61 | 62 | private void writeTimeCount(int timeCount) { 63 | this.currentSharedPreferences.edit().putInt( 64 | Constants.SHAREDPREF_RUNNINGTIMECOUNT_STRING, 65 | timeCount).commit(); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /gen/com/example/alwayson/R.java: -------------------------------------------------------------------------------- 1 | /* AUTO-GENERATED FILE. DO NOT MODIFY. 2 | * 3 | * This class was automatically generated by the 4 | * aapt tool from the resource data it found. It 5 | * should not be modified by hand. 6 | */ 7 | 8 | package com.example.alwayson; 9 | 10 | public final class R { 11 | public static final class attr { 12 | } 13 | public static final class dimen { 14 | /** Default screen margins, per the Android Design guidelines. 15 | 16 | Customize dimensions originally defined in res/values/dimens.xml (such as 17 | screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here. 18 | 19 | */ 20 | public static final int activity_horizontal_margin=0x7f040000; 21 | public static final int activity_vertical_margin=0x7f040001; 22 | } 23 | public static final class drawable { 24 | public static final int ic_launcher=0x7f020000; 25 | } 26 | public static final class id { 27 | public static final int action_settings=0x7f080000; 28 | } 29 | public static final class layout { 30 | public static final int activity_main=0x7f030000; 31 | } 32 | public static final class menu { 33 | public static final int main=0x7f070000; 34 | } 35 | public static final class string { 36 | public static final int action_settings=0x7f050001; 37 | public static final int app_name=0x7f050000; 38 | public static final int hello_world=0x7f050002; 39 | } 40 | public static final class style { 41 | /** 42 | Base application theme, dependent on API level. This theme is replaced 43 | by AppBaseTheme from res/values-vXX/styles.xml on newer devices. 44 | 45 | 46 | Theme customizations available in newer API levels can go in 47 | res/values-vXX/styles.xml, while customizations related to 48 | backward-compatibility can go here. 49 | 50 | 51 | Base application theme for API 11+. This theme completely replaces 52 | AppBaseTheme from res/values/styles.xml on API 11+ devices. 53 | 54 | API 11 theme customizations can go here. 55 | 56 | Base application theme for API 14+. This theme completely replaces 57 | AppBaseTheme from BOTH res/values/styles.xml and 58 | res/values-v11/styles.xml on API 14+ devices. 59 | 60 | API 14 theme customizations can go here. 61 | */ 62 | public static final int AppBaseTheme=0x7f060000; 63 | /** Application theme. 64 | All customizations that are NOT specific to a particular API-level can go here. 65 | */ 66 | public static final int AppTheme=0x7f060001; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/com/example/alwayson/service/Bootstrap.java: -------------------------------------------------------------------------------- 1 | package com.example.alwayson.service; 2 | 3 | import android.app.AlarmManager; 4 | import android.app.PendingIntent; 5 | import android.content.ComponentName; 6 | import android.content.Context; 7 | import android.content.Intent; 8 | import android.content.pm.PackageManager; 9 | import java.util.Calendar; 10 | 11 | import com.example.alwayson.Constants; 12 | 13 | public class Bootstrap { 14 | 15 | private static String TAG = Bootstrap.class.getSimpleName(); 16 | 17 | public static synchronized void startAlwaysOnService(Context context, 18 | String loadedFrom) { 19 | 20 | if (AlwaysOnService.isRunning == false) { 21 | // start service 22 | Intent pIntent = new Intent(context, AlwaysOnService.class); 23 | pIntent.putExtra(Constants.STARTUP_ACTION_NAME, loadedFrom); 24 | context.startService(pIntent); 25 | 26 | // enable 10 secs restart 27 | Intent mIntent = new Intent(context, AlarmBroadcastReceiver.class); 28 | mIntent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 29 | mIntent.putExtra(Constants.STARTUP_ACTION_NAME, loadedFrom); 30 | mIntent.setAction(AlarmBroadcastReceiver.ACTION_CUSTOM_ALARM); 31 | PendingIntent sender = PendingIntent.getBroadcast(context, 0, 32 | mIntent, 0); 33 | Calendar time = Calendar.getInstance(); 34 | time.setTimeInMillis(System.currentTimeMillis()); 35 | time.add(Calendar.SECOND, 1); 36 | 37 | AlarmManager am = (AlarmManager) context 38 | .getSystemService(Context.ALARM_SERVICE); 39 | 40 | am.setRepeating(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), 41 | Constants.ALARM_REPEAT_INTERVAL * 1000, sender); 42 | 43 | // enable boot/powerkey restart 44 | setBootupListen(context, true); 45 | } 46 | } 47 | 48 | public static synchronized void stopAlwaysOnService(Context context) { 49 | 50 | // stop service 51 | Intent pIntent = new Intent(context, AlwaysOnService.class); 52 | context.stopService(pIntent); 53 | 54 | // cancel alarm restart 55 | Intent intent = new Intent(context, AlarmBroadcastReceiver.class); 56 | intent.setAction(AlarmBroadcastReceiver.ACTION_CUSTOM_ALARM); 57 | PendingIntent sender = PendingIntent 58 | .getBroadcast(context, 0, intent, 0); 59 | AlarmManager alarmManager = (AlarmManager) context 60 | .getSystemService(Context.ALARM_SERVICE); 61 | alarmManager.cancel(sender); 62 | 63 | // cancel boot/power key restart 64 | setBootupListen(context, false); 65 | } 66 | 67 | private static void setBootupListen(Context context, boolean isEnabled) { 68 | int flag = (isEnabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED 69 | : PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 70 | ComponentName component = new ComponentName(context, 71 | RebootBroadcastReceiver.class); 72 | 73 | context.getPackageManager().setComponentEnabledSetting(component, flag, 74 | PackageManager.DONT_KILL_APP); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | 46 | [Dd]ebug/ 47 | [Rr]elease/ 48 | x64/ 49 | build/ 50 | [Bb]in/ 51 | [Oo]bj/ 52 | 53 | # MSTest test Results 54 | [Tt]est[Rr]esult*/ 55 | [Bb]uild[Ll]og.* 56 | 57 | *_i.c 58 | *_p.c 59 | *.ilk 60 | *.meta 61 | *.obj 62 | *.pch 63 | *.pdb 64 | *.pgc 65 | *.pgd 66 | *.rsp 67 | *.sbr 68 | *.tlb 69 | *.tli 70 | *.tlh 71 | *.tmp 72 | *.tmp_proj 73 | *.log 74 | *.vspscc 75 | *.vssscc 76 | .builds 77 | *.pidb 78 | *.log 79 | *.scc 80 | 81 | # Visual C++ cache files 82 | ipch/ 83 | *.aps 84 | *.ncb 85 | *.opensdf 86 | *.sdf 87 | *.cachefile 88 | 89 | # Visual Studio profiler 90 | *.psess 91 | *.vsp 92 | *.vspx 93 | 94 | # Guidance Automation Toolkit 95 | *.gpState 96 | 97 | # ReSharper is a .NET coding add-in 98 | _ReSharper*/ 99 | *.[Rr]e[Ss]harper 100 | 101 | # TeamCity is a build add-in 102 | _TeamCity* 103 | 104 | # DotCover is a Code Coverage Tool 105 | *.dotCover 106 | 107 | # NCrunch 108 | *.ncrunch* 109 | .*crunch*.local.xml 110 | 111 | # Installshield output folder 112 | [Ee]xpress/ 113 | 114 | # DocProject is a documentation generator add-in 115 | DocProject/buildhelp/ 116 | DocProject/Help/*.HxT 117 | DocProject/Help/*.HxC 118 | DocProject/Help/*.hhc 119 | DocProject/Help/*.hhk 120 | DocProject/Help/*.hhp 121 | DocProject/Help/Html2 122 | DocProject/Help/html 123 | 124 | # Click-Once directory 125 | publish/ 126 | 127 | # Publish Web Output 128 | *.Publish.xml 129 | *.pubxml 130 | 131 | # NuGet Packages Directory 132 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 133 | #packages/ 134 | 135 | # Windows Azure Build Output 136 | csx 137 | *.build.csdef 138 | 139 | # Windows Store app package directory 140 | AppPackages/ 141 | 142 | # Others 143 | sql/ 144 | *.Cache 145 | ClientBin/ 146 | [Ss]tyle[Cc]op.* 147 | ~$* 148 | *~ 149 | *.dbmdl 150 | *.[Pp]ublish.xml 151 | *.pfx 152 | *.publishsettings 153 | 154 | # RIA/Silverlight projects 155 | Generated_Code/ 156 | 157 | # Backup & report files from converting an old project file to a newer 158 | # Visual Studio version. Backup files are not needed, because we have git ;-) 159 | _UpgradeReport_Files/ 160 | Backup*/ 161 | UpgradeLog*.XML 162 | UpgradeLog*.htm 163 | 164 | # SQL Server files 165 | App_Data/*.mdf 166 | App_Data/*.ldf 167 | 168 | ############# 169 | ## Windows detritus 170 | ############# 171 | 172 | # Windows image file caches 173 | Thumbs.db 174 | ehthumbs.db 175 | 176 | # Folder config file 177 | Desktop.ini 178 | 179 | # Recycle Bin used on file shares 180 | $RECYCLE.BIN/ 181 | 182 | # Mac crap 183 | .DS_Store 184 | 185 | 186 | ############# 187 | ## Python 188 | ############# 189 | 190 | *.py[co] 191 | 192 | # Packages 193 | *.egg 194 | *.egg-info 195 | dist/ 196 | build/ 197 | eggs/ 198 | parts/ 199 | var/ 200 | sdist/ 201 | develop-eggs/ 202 | .installed.cfg 203 | 204 | # Installer logs 205 | pip-log.txt 206 | 207 | # Unit test / coverage reports 208 | .coverage 209 | .tox 210 | 211 | #Translations 212 | *.mo 213 | 214 | #Mr Developer 215 | .mr.developer.cfg 216 | --------------------------------------------------------------------------------